簡體   English   中英

如何在django視圖中使用python多處理模塊

[英]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.

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