[英]Performing non-blocking requests? - Django
最近,我一直在使用其他框架,例如NodeJS。
我喜歡返回響應並仍然可以執行進一步操作的可能性。
例如
def view(request):
do_something()
return HttpResponse()
do_more_stuff() #not possible!!!
也許Django已經提供了一種在返回請求后執行操作的方法,如果這種情況很好。
幫助將不勝感激! = D
不要直接使用,因為您已經退出了方法。 您可以使用像Celery這樣的東西,它將do_more_stuff
任務傳遞到隊列中,然后使其在http請求/響應流之外運行do_more_stuff()
。
因為您要從函數返回,所以永遠不會調用do_more_stuff。
如果您正在考慮做一些繁重的工作,請按照羅斯的建議在排隊之前先排隊(Celery +1)。
但是,如果您正在尋找返回某些內容...,那么您可能正在尋找做某件事並將更多內容返回給用戶流。 您可以將迭代器或生成器傳遞給HttpResponse,它將以點滴的方式迭代並推出內容。 感覺有點不對勁,但是如果您是發電機搖滾明星,則可以在各種狀態下完成足夠的工作來完成您想要的。
或者我想您可以簡單地重新設計頁面,以使用大量的ajax來完成所需的工作,包括將事件觸發到django視圖,從視圖中讀取數據等。
歸結為異步負擔的重擔:客戶端,服務器或響應。
我還不太熟悉node.js,但是看到您正在談論的用例將很有趣。
編輯:我做了一些調查信號,雖然它們確實發生在過程中,但在django處理了請求之后,有一個內置的request_finished信號,盡管它比特定的東西更籠統。
您可以將線程用作臨時修復程序或非生產解決方案,但它既不可擴展,也不是最佳實踐。 使用芹菜進行更好的設計!
def foo(request):
import threading
from time import sleep
def foo():
sleep(5)
# Do something
print('hello, world')
threading.Thread(target=foo).start()
return JsonResponse(data={'detail': 'thread started'})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.