线程池某个线程异常,线程池一个线程异常,其他线程
我一直在寻找一个简单的大蟒线程池模式的良好实现,实际上找不到任何适合我需要的东西。我正在使用python 2.7,我发现的所有模块都不起作用,或者没有正确处理工作程序中的异常。我想知道是否有人知道可以提供我正在搜索的功能类型的库。非常感谢。
多处理
我的第一次尝试是使用内置的多重处理模块,但由于这不使用线程而是使用子进程,而是遇到了无法对对象进行泡菜的问题。不要去这里。
从多处理导入池
类别示例(对象):
定义compute_fib(self,n):
=(1 5 * * 0.5)/2
自我。fib=int(round((phi * * n-(1-phi)* * n)/5 * * 0.5))
样本=[范围(8)中我的样本()
池=池(进程=8)
对于示例中的s:游泳池。apply _ async(s . compute _ fib,[20])
pool.join()
对于样品中的硫:打印硫纤维
# PicklingError:无法泡菜:属性查找__内置_ _ .实例方法失败
期货
所以我看到有一个python 3.2在这里的一些很酷的并发功能的后端口。这似乎完美且易于使用。问题是忐忑的钢笔在其中一个工人中得到一个异常时,你只得到异常的类型,例如"零除法错误"但没有回溯,因此没有指示哪一行导致了异常。代码变得无法调试。不行。
来自并行进口期货
类别示例(对象):
定义compute_fib(self,n):
=(1 5 * * 0.5)/2
1/0
自我。fib=int(round((phi * * n-(1-phi)* * n)/5 * * 0.5))
样本=[范围(8)中我的样本()
资金池=期货ThreadPoolExecutor(max _ workers=8)
线程=[池。submit(s . compute _ fib,20) for s in samples]
wait(threads,return_when=futures .FIRST _异常)
对于线程中的测试:测试结果()
对于样品中的硫:打印硫纤维
# futures-2.1.3-py2.7.egg/concurrent/futures/_base.pyc在_ _获取结果(自身)
# 354 def __get_result(self):
# 355如果自我。_异常:
# - 356提高自我。_异常
# 357其他:
# 358回归自我。_结果
#
# ZeroDivisionError:整数除法或以零为模
工作者池
我找到了这种模式的其他实现这里。这次发生异常时会打印出来,但是我的分析交互式解释器处于挂起状态,需要从其他壳中杀死。不行。
导入工人池
类别示例(对象):
定义compute_fib(self,n):
=(1 5 * * 0.5)/2
1/0
自我。fib=int(round((phi * * n-(1-phi)* * n)/5 * * 0.5))
样本=[范围(8)中我的样本()
池=工作池。工人池(大小=8)
对于样本中的s: pool.map(s.compute_fib,[20])
pool.wait()
对于样品中的硫:打印硫纤维
# ZeroDivisionError:整数除法或以零为模
# ^C^C^C^C^C^C^C^C^D^D
# $杀死1783
线程池
还有另一种实施这里。这次发生异常时,会将其打印到stderr,但脚本不会被中断而是继续执行,这会违反异常的目的并使事情变得不安全。仍然无法使用。
导入线程池
类别示例(对象):
定义compute_fib(self,n):
=(1 5 * * 0.5)/2
1/0
自我。fib=int(round((phi * * n-(1-phi)* * n)/5 * * 0.5))
样本=[范围(8)中我的样本()
池=线程池。线程池(8)
请求=[线程池。请求(s . compute _ fib,[20])样本中的s]
requests=[y for x in requests for y in x]
对于请求中的r:泳池。上传请求(r)
pool.wait()
对于样品中的硫:打印硫纤维
# ZeroDivisionError:整数除法或以零为模
# ZeroDivisionError:整数除法或以零为模
# ZeroDivisionError:整数除法或以零为模
# ZeroDivisionError:整数除法或以零为模
# ZeroDivisionError:整数除法或以零为模
# ZeroDivisionError:整数除法或以零为模
# ZeroDivisionError:整数除法或以零为模
# ZeroDivisionError:整数除法或以零为模
# - 17代表样品中的学生:打印s纤维
#
#属性错误:“样本”对象没有属性“撒谎”
-更新-
看来,关于未来库,python 3的行为与python 2不同。
期货_异常。py:
从并行未来导入ThreadPoolExecutor,已完成
def div_zero(x):
返回x/0
使用ThreadPoolExecutor(max _ workers=4)作为执行器:
futures=executor.map(div_zero,range(4))
对于完工状态下的将来(将来):打印(将来)
Python 2.7.6输出:
回溯(最近一次呼叫):
文件. futures_exceptions.py ,第12行,在
对于已完成的将来(将来):
文件.python 2.7/site-packages/concurrent/futures/_ base。py ,第198行,在已完成中
with _AcquireFutures(fs):
文件.python 2.7/site-packages/concurrent/futures/_ base。py ,第147行,在__init__中
self.futures=sorted(futures,key=id)
文件.python 2.7/site-packages/concurrent/futures/_ base。py ,地图中的第549行
yield future.result()
文件.python 2.7/site-packages/concurrent/futures/_ base。py ,结果中的第397行
回归自我__get_result()
文件.python 2.7/site-packages/concurrent/futures/_ base。py ,第356行,在_ _获取结果中
提升自我。_异常
ZeroDivisionError:整数除法或以零为模
Python 3.3.2输出:
回溯(最近一次呼叫):
文件. futures_exceptions.py ,第11行,在
对于已完成的将来(将来):
文件.python 3.3/concurrent/futures/_ base。py ,第193行,在已完成中
with _AcquireFutures(fs):
文件.python 3.3/concurrent/futures/_ base。py ,第142行,在__init__
self.futures=sorted(futures,key=id)
文件.python 3.3/concurrent/futures/_ base。py ,第546行,在结果迭代器中
yield future.result()
文件.python 3.3/concurrent/futures/_ base。py ,结果中的第392行
回归自我__get_result()
文件.python 3.3/concurrent/futures/_ base。py ,第351行,在_ _获取结果中
提升自我。_异常
文件.python 3.3/并发/期货/线程。py ,第54行,运行中
result=self.fn(*self.args,**self.kwargs)
文件.futures_exceptions.py ,div_zero中的第七行
返回x/0
ZeroDivisionError:除以零