蟒蛇& db异步请求(又名“即发即忘”):怎么样?

时间:2017-02-16 09:00:19

标签: python multithreading asynchronous python-asyncio

在函数中间我希望能够触发对DB的调用(刻录结果),但该函数继续运行,这样我就不会遇到 I / O瓶颈。这是一个Web应用程序。所有人都离线了。

用于解释性目的的代码段

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 或其他工具。我没有成功地完成这项特殊的努力。我会采取任何有效的解决方案。

任何帮助?

ps: 并发/锁定之类的问题就好了,因为在我的情况下,我的函数计算所需的时间远远大于要写的数据库。

1 个答案:

答案 0 :(得分:2)

您可以使用ThreadPoolExecutor,它提供了一个简单的界面来将callable安排到工作池。特别是,您可能对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))