2013-12-10 19 views
1

我已經定義了一個Django任務(它使用./manage.py task_name啓動)。該任務從數據庫讀取一組對象,並對每個對象執行操作(通常發送ping),將每個單獨的結果寫回數據庫。從django任務並行化函數的最佳方式

目前我有一個普通的for循環,但它顯然太慢,因爲它等待每個ping結束以開始下一個循環。所以我的問題是,並行操作的最佳方式是什麼?

據我所閱讀,我發現的最佳方法是使用multiprocessing模塊中的Pool,如the code in this answer

回答

1

對於你的任務,看起來很簡單,multiprocessing可能是最簡單的方法,如果僅僅因爲它已經是stdlib的一部分。你可以這樣做(未經測試!):

def run_process(record): 
    result = ping(record) 

pool = Pool(processes=10) 
results = pool.map_async(run_process, [records]) 
for r in results.get(): 
    write_to_database(r) 
0

我會說,最好的工具是一樣twisted library

不像多線程/多處理解決方案的一些事件驅動的網絡引擎,當談到事件驅動的網絡引擎照耀到激烈的IO操作,沒有上下文切換和等待塊操作,他們以最有效的方式使用系統資源。

使用扭曲庫的一種方法是編寫一個scrapy spider,它可以處理外部網絡調用,如您提到的那些ping請求以及將響應寫回數據庫。

寫這種蜘蛛的幾個原則:

  1. ,以從數據庫中讀取URL的蜘蛛列表,請參閱https://gist.github.com/saidimu/1024207
  2. 正確寫入數據庫的響應看到Writing items to a MySQL database in Scrapy

一旦你有這個蜘蛛書面,只需從您的django命令或直接從外殼啓動它:

scrapy crawl <spider name> 
1

我只是推薦celery

編寫您想要執行並行/異步操作的芹菜任務。讓芹菜處理併發性,你自己的代碼可以擺脫混亂的進程管理。

相關問題