最佳答案
我只是对自己写的一些代码感到非常困惑,我惊讶地发现:
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
results = list(executor.map(f, iterable))
还有
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
results = list(map(lambda x: executor.submit(f, x), iterable))
产生不同的结果。第一个函数生成 f
返回的任何类型的列表,第二个函数生成 concurrent.futures.Future
对象的列表,然后需要使用它们的 result()
方法对这些对象进行计算,以获得 f
返回的值。
我主要关心的是,这意味着 executor.map
不能利用 concurrent.futures.as_completed
,这似乎是一种非常方便的方式来评估一些长时间运行的数据库调用的结果,我正在使他们成为可用的。
我完全不清楚 concurrent.futures.ThreadPoolExecutor
对象是如何工作的——天真地说,我更喜欢(稍微更详细一些) :
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
result_futures = list(map(lambda x: executor.submit(f, x), iterable))
results = [f.result() for f in futures.as_completed(result_futures)]
更简洁的 executor.map
,以便利用可能的性能增益。我这样做有错吗?