并发.futures在Python 3中引入,允许开发人员以异步方式执行函数并在后台使用线程池或进程池完成任务。但是,当使用它时,可能会遇到以下问题:
在使用executor.submit时,异常可能会被吞噬,使得错误难以排除。
当使用executor.map和executor.submit等高阶函数时,它们不遵循传递顺序以及可能会丢失重要的返回值。
当使用进程池时,由于每个进程都有自己的Python解释器,因此可能会遇到与全局变量共享状态的困难。
解决这些问题的方法有:
import concurrent.futures
import logging
def test_function(n):
1 / n
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG)
with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
try:
executor.submit(test_function, 0).result()
except Exception as exc:
logging.exception('Exception occurred')
def test_function(n):
if n == 2:
return n * 2
else:
raise ValueError('Invalid value: {}'.format(n))
if __name__ == '__main__':
with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
results = []
for i in range(10):
results.append(executor.submit(test_function, i))
for result in concurrent.futures.as_completed(results):
try:
print(result.result())
except Exception as exc:
print('Generated an exception: %s' % exc)
这里,我们手动地迭代并使用concurrent.futures.as_completed函数获得任务的结果。