【发布时间】:2017-12-12 20:32:00
【问题描述】:
我有一个程序,我目前正在使用 concurrent.futures.ThreadPoolExecutor 来同时运行多个任务。这些任务通常是 I/O 绑定的,涉及对本地数据库和远程 REST API 的访问。但是,这些任务本身可以拆分为子任务,这也将受益于并发性。
我希望在任务中使用 concurrent.futures.ThreadPoolExecutor 是安全的。我编写了一个玩具示例,似乎可行:
import concurrent.futures
def inner(i, j):
return i, j, i**j
def outer(i):
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
futures = {executor.submit(inner, i, j): j for j in range(5)}
results = []
for future in concurrent.futures.as_completed(futures):
results.append(future.result())
return results
def main():
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
futures = {executor.submit(outer, i): i for i in range(10)}
results = []
for future in concurrent.futures.as_completed(futures):
results.extend(future.result())
print(results)
if __name__ == "__main__":
main()
虽然这个玩具示例似乎有效,但我希望这是有意为之的。我希望是这样,否则使用 executor 执行任意代码是不安全的,以防它还使用 concurrent.futures 来利用并发性。
【问题讨论】:
-
Mhhh 认为您应该避免使用分叉炸弹。您是否衡量过子线程前后花费的时间?
标签: python multithreading python-3.x python-multithreading concurrent.futures