[英]How to use python multiprocessing module in django view
我有一個簡單的函數,遍歷一個URL列表,使用GET
來檢索一些信息並相應地更新DB( PostgresSQL
)。 功能完美。 但是,每次訪問每個URL一次會說太多時間。
使用python,我可以執行以下操作來並行執行這些任務:
from multiprocessing import Pool
def updateDB(ip):
code goes here...
if __name__ == '__main__':
pool = Pool(processes=4) # process per core
pool.map(updateDB, ip)
這工作得很好。 但是,我正試圖找到django項目的相同方法。 目前我有一個函數(視圖),遍歷每個URL以獲取信息,並更新數據庫。
我唯一能找到的就是使用Celery,但這似乎對我想要執行的簡單任務有點過分。
有什么簡單的我可以做或者我必須使用芹菜嗎?
盡管使用Celery似乎有些過分,但這是一種眾所周知的異步任務方式。 本質上,Django提供WSGI請求 - 響應周期,它對多處理或后台任務一無所知。
以下是備選方案:
目前我有一個函數(視圖),遍歷每個URL以獲取信息,並更新數據庫。
這意味着響應時間對您來說無關緊要,而不是在后台(異步)執行它,如果您的響應時間減少4(使用4個子進程/線程),您可以在前台執行它。 如果是這種情況,您只需將示例代碼放在視圖中即可。 喜歡
from multiprocessing import Pool
def updateDB(ip):
code goes here...
def my_view(request):
pool = Pool(processes=4) # process per core
pool.map(updateDB, ip)
return HttpResponse("SUCCESS")
但是,如果你想在后台異步執行,那么你應該使用Celery或者遵循@ BasicWolf的建議。
我建議使用gevent進行多線程解決方案而不是多處理。 多處理可能會導致產生新進程受限制的生產環境中出現問題。
示例代碼:
from django.shortcuts import HttpResponse
from gevent.pool import Pool
def square(number):
return number * number
def home(request):
pool = Pool(50)
numbers = [1, 3, 5]
results = pool.map(square, numbers)
return HttpResponse(results)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.