簡體   English   中英

執行非阻塞請求? -Django

[英]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()

Django使您可以使用Signals完成此操作,更多信息可以在此處找到。 (請注意,正如我在下面的評論中所述,信號並不是非阻塞的,但它們確實允許您在視圖中返回響應后執行代碼。)

如果您正在考慮執行許多異步請求,並且希望它們是非阻塞的,那么您可能想看看Tornado

因為您要從函數返回,所以永遠不會調用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.

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