簡體   English   中英

如何在django-celery中使用.delay()方法?

[英]How to use the .delay() method in django-celery?

我想使用.delay實現異步行為。 使用它的主要原因是為了加快我的視野。 我做錯了嗎? 如果是這樣,我應該如何正確做?

下面是示例代碼:

View.py

@cache_page(60*60*24)
def my_view(request):
    something ..... .... ....
    a = SomeModel.objects.get(pk=id)
    data = celery_task.delay(a)
    return dumpjson(status='ok', data=data, callback=callback)

Task.py

def celery_task(a):
    res = request.get('http:sample.sample.com/feed/result' params={'abc': 'abc'})
    return {'response': res}

如果我從celery_task獲得響應,它將顯示一些guid(1b52f519-64cb-43da-844a-2886bcccb9bc),並且錯誤如下所示:

<EagerResult: 1b52f519-64cb-43da-844a-2886bcccb9bc> is not JSON serializable

您正在延遲該函數並異步調用它。 因此,不可避免地, 您的代碼不會等到得到結果后再進行操作 因為這很重要。

因此,Celery將開始在后台運行celery_task ,並且您將不得不向客戶端返回一些內容而又不知道結果是什么。 也許完成任務就可以將數據保存到數據庫中,下次用戶進入頁面時,您可以顯示數據庫中已完成的數據。 或其他。

.delay獲得的.delay是對后台任務的一種處理。 您可以在其上調用.get() (如果我沒記錯的話),它將一直掛起,直到獲得返回值為止,但是您又回到了同步調用該函數的狀態。

您將不會延遲獲取返回的數據,除了任務ID外,請使用http://docs.celeryproject.org/en/master/userguide/remote-tasks.html#enabling-the-http-task

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM