线程是一个轻型实体,只有由很少的支持其独立运行的资源。 对于Python,线程拥有自己独立的栈, 当线程运行出错,线程会直接结束运行,当需要进行错误处理时,一般都会在线程中进行处理,但是如果只能由主进程来处理异常,那么线程要怎么才能将异常通知给主进程呢?对于进程,子进程的产生的异常如何让父进程去处理?
Multiprocessing PackageMultiprocessing是Python的一个多进程库,其实现的API类似threading. 其子模块dummy实现了与Multiprocessing.process相同的API,唯一的区别在于,dummy其实只是对threading做了一层封装而已. 这给不知道是CPU密集型或者是IO密集型的项目提供了便利,你可以自由地在多进程与多线程之间进行切换而只需更改一行代码。
调用error_callback函数在python3中, Multiprocessing对与apply_async()进行了改进,增加了一个默认参数error_callback=None,在这里你可以指定相应的错误处理函数,它将在子进程或者子线程运行出现异常是被调用. 与之对应的是callback=None参数(Python2也支持),它将在子进程或者子线程顺利运行之后被调用.
其原理,在于子线程或者子进程的一个_success属性, 其指出了运行状态.
[Python] 纯文本查看 复制代码 def get(self, timeout=None): self.wait(timeout)
if not self.ready():
raise TimeoutError
if self._success:
return self._value
else:
raise self._value
def _set(self, i, obj):
self._success, self._value = obj
if self._callback and self._success:
self._callback(self._value)
if self._error_callback and not self._success:
self._error_callback(self._value)
self._event.set()
del self._cache[self._job]
需要注意的是,raise self._value语句抛出的是一个Exception.AttributeError, 可以看出只会抛出两种错误,一种是超时错误,一种是AttributeError. 而我们能利用的就是AttributeError, 在线程或者进程执行过程种出现错误, 我们只需要将合适的错误信息使用格式化字符串通过AttributeError传递出去,在error_callback去获取这个错误信息,在进行进一步的处理即可, 如果你只需要告知主进程出错了,那么只需要raise AttributeError即可.
检查线程退出状态由于线程出现异常退出和正常退出时的exitcode时不一样的,而线程结束运行后,内存又不会立即被回收,基于此,我们可以通过检查exitcode的方式来捕获线程中出现的错误,这种方法来自PengMeng's Blog, 一般地,Python中进程的属性, 或许可以达到和exitcode相同的效果. 这里不再深入讨论.
|