在 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
列表中的顺序。
我正在尝试对给定数据集中的两个相邻元素应用特定函数。请参考下面的例子。
# 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
列表中的顺序。