A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

线程是一个轻型实体,只有由很少的支持其独立运行的资源。 对于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相同的效果. 这里不再深入讨论.




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马