概述
之前我们讨论过使用concurrent.futures.ProcessPoolExecutor构件进程池实现并行处理:
with concurrent.futures.ProcessPoolExecutor(max_workers=3) as executor:
futures = [executor.submit(self.ExcecuteGridTest, element) for element in self.testCase]
for future in concurrent.futures.as_completed(futures):
#获取每个测试结果
testResult=future.result()
....
print('testResult',self.testResult)
这段代码看上去没有什么问题,但是如果主要处理函数ExcecuteGridTest处理时间过长就会报错:
造成这个错误原因,判断为executor.submit和处理函数ExcecuteGridTest是异步调用
concurrent.futures.as_completed(futures)调用结果是就会出现问题。
解决方案:
with concurrent.futures.ProcessPoolExecutor(max_workers=3) as executor:
futures = [executor.submit(self.ExcecuteGridTest, element) for element in self.testCase]
for future in concurrent.futures.as_completed(futures):
#获取每个测试结果
**try:**
df_testlog=future.result()
...
print('testResult',self.testResult)
**except Exception as e:
print('data is loaded error,'+repr(e))
traceback.print_exc()**
``
实际上就是加了 try... except ,在执行过程中捕捉到错误,抛出异常后,不会中断,继续执行循环,但是ExcecuteGridTest总会处理完,所以最后还是能够得到所有的进程结果
如果有更好更优雅的办法解决,或者发现本文判断有什么问题,请不吝赐教,谢谢
最后
以上就是发嗲小鸽子为你收集整理的进程池并行处理的一个小坑的全部内容,希望文章能够帮你解决进程池并行处理的一个小坑所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复