2016-02-29 90 views
2

我有一個簡單的函數來檢查URL列表,使用GET來檢索一些信息並相應地更新DB(PostgresSQL)。該功能完美。但是,一次一個地瀏覽每個URL會說多少時間。如何在django視圖中使用python多重處理模塊

使用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的函數(視圖)來獲取信息,並更新數據庫。

我能找到的唯一東西就是使用芹菜,但是對於我想要執行的簡單任務來說,這似乎有點壓倒性。

有什麼簡單的,我可以做或我必須使用芹菜?

+0

這是一個重複出現的任務嗎?也許一個自定義管理命令作爲cronjob運行是另一種選擇。 – ilse2005

+1

這真的取決於你想要的響應時間。您可以讓服務器在處理Celery任務後立即響應,或者可以執行多處理,然後仍需要一些時間。不過,不要打擾'多處理',我建議使用優秀的'joblib'庫。 –

回答

0

目前我有去在每個URL獲得 信息,並更新數據庫的函數(視圖)。

這意味着(使用4個子流程響應時間不要緊,你不是在後臺(異步)做這件事,你是在前臺做就OK了,如果你的響應時間由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") 

但是,如果你希望異步做背景,那麼你應該用芹菜或遵循@ BasicWolf的建議之一。

+0

這就是我的情況。我不需要在背景上運行任何東西(這就是爲什麼我發現芹菜不是最好的解決方案)。 我實際上已經嘗試過你的建議,因爲我認爲它可能有效。但是,我收到了一個錯誤「模型尚未加載」。儘管這是不可能的。 你知道爲什麼會出現以下異常嗎? 異常類型:\t AppRegistryNotReady 異常值:\t模型尚未加載。 –

+0

你的Django vesion是什麼?在Django上爲我工作1.8.2 –

+0

Django版本1.8.6 我會再次檢查我的代碼,以確保正確執行了所有更改。我想我會嘗試一個新的簡單功能。也許在我的代碼中的其他東西製造麻煩。 –

2

雖然使用芹菜可能看起來是一種矯枉過正,但它是一種衆所周知的異步任務方式。基本上,Django提供WSGI請求 - 響應循環,它對多處理或後臺任務一無所知。

這裏有替代方案:

1

我會推薦使用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) 
相關問題