在 python 中同时执行多项任务

multi task at once in python

我正在尝试对给定数据集中的两个相邻元素应用特定函数。请参考下面的例子。

# I'll just make a simple function here.
# In my real case, I send request to database 
# to get the result with two arguments.

def get_data_from_db_with(arg1, arg2):
    # write a query with arg1 and arg2 named 'query_result'
    return query_result

data = [arg1, arg2, arg3, arg4]
result = []
for a, b in zip(data, data[1:]):
    result.append(get_data_from_db_with(a, b))

例如,如果数据的长度是 4,如上所示,那么我向数据库发送请求 3 次。每个请求大约需要 0.3 秒来检索数据,因此总共需要 0.9 秒(0.3 秒 * 3 个请求)。问题是随着请求数量的增加,总时间也会增加。我想做的是,如果可能的话,一次发送所有请求。基本上,它看起来像这样。

使用上面的代码,

1) get_data_from_db_with(arg1, arg2)
2) get_data_from_db_with(arg2, arg3)
3) get_data_from_db_with(arg3, arg4)

将连续处理。


如果可能的话,我想做的是一次发送所有请求,而不是连续发送。当然,请求的数量保持不变。但是根据我的假设,整体时间消耗会减少。

现在我正在搜索异步、多处理等。 任何评论或反馈都将非常有帮助。

提前致谢。

多处理的替代方法是处理查询构造本身。寻找组合查询的方法,例如 (arg1 and arg2) or (arg2 and arg3)...,本质上是尝试在一次调用中获取所有必需的数据。

Threads 可能就是您要找的。假设 get_data_from_db_with 所做的大部分工作是等待 i/o,比如调用数据库。

import threading

def get_data_from_db_with(arg1, arg2):
    # write a query with arg1 and arg2 named 'query_result'
    current_thread = threading.current_thread()
    current_thread.result = query_result

data = [arg1, arg2, arg3, arg4]
threads = []
for a, b in zip(data, data[1:]):
    t = threading.Thread(target=get_data_from_db_with, args=(a,b))
    t.start()
    threads.append(t)

results = []
for t in threads:
    t.join()
    results.append(t.result)

请注意,此解决方案甚至保留了 results 列表中的顺序。