我有一个程序,目前正在使用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()
尽管这个玩具示例似乎可以工作,但我希望有些信心证明这是有意的。我希望它是有意的,因为否则在使用执行器执行任意代码时将不安全,以防它还使用concurrent.futures来利用并发性。