2017-02-16 67 views
1

在函數中間我希望能夠觸發數據庫調用(燒結結果),但函數繼續運行,所以我不會遇到I/O瓶頸。這是不是的一個web應用程序。全部離線。python&db異步請求(又名又火又火):如何?

片段爲解釋目的:

a = list(range(100)) 
for i in a: 
    my_output = very_long_function(i) 
    # I'd like to_sql to run in a "fire-and-forget fashion" 
    function_of_choice_to_sql(my_output) 

我不知道我是否與線程庫,ASYNCIO或其他工具更好。我沒有在這個特別的努力中取得成功。我會採取任何工作解決方案。

有幫助嗎?

P.S:會有喜歡與併發/鎖定沒有問題,等等,因爲在我的情況,我的功能將用來計算時間遠遠大於時間寫入數據庫越大。

+0

如果可能,您可以使用celery完成此後臺任務。 – 2017-02-16 09:02:54

回答

2

您可以使用ThreadPoolExecutor,它提供了一個簡單的界面來將可調參數安排到工作者池中。特別是,您可能對map方法感興趣:

from concurrent.futures import ThreadPoolExecutor 

with ThreadPoolExecutor(max_workers=4) as executor: 
    # Lazy map (python3 only) 
    outputs = map(very_long_function, range(10)) 
    # Asynchronous map 
    results = executor.map(function_of_choice_to_sql, outputs) 
    # Wait for the results 
    print(list(results)) 
+0

很酷。我會馬上嘗試一下 – Asher11

相關問題