python中主线程怎样捕获子线程的异常

Python016

python中主线程怎样捕获子线程的异常,第1张

最近因为别的需求,写了一个模块,似乎在这里能用得上:

https://github.com/SakuraSa/ChatProcess

其中的 example.py :

#!/usr/bin/env python

# coding = utf-8

"""

example

"""

__author__ = 'Rnd495'

from time import sleep

from ChatProcess import Chatroom

class Echo(Chatroom):

    """

    Echo

    """

    def response(self, data):

        if data.startswith('sleep'):

            sec = float(data[6:])

            sleep(sec)

            return 'wake up after %dms' % (sec * 1000)

        elif data:

            return data

        else:

            self.stop()

            return 'goodbye'

if __name__ == '__main__':

    from ChatProcess import TimeoutError, ProcessError

    print 'process 01:'

    e = Echo.create_process(lifetime=1).start()

    print e.chat('Hello world!'), e.remain

    print e.chat('sleep:0.1'), e.remain

    print e.chat(''), e.remain

    print ''

    print 'process 02:'

    e = Echo.create_process(lifetime=1).start()

    try:

        print e.chat('Hello world!'), e.remain

        print e.chat('sleep:1.0'), e.remain

        print e.chat(''), e.remain

    except TimeoutError, error:

        print 'error:', error

    print ''

    print 'process 03:'

    e = Echo.create_process(lifetime=1).start()

    try:

        print e.chat('Hello world!'), e.remain

        print e.chat('sleep:not a num'), e.remain

        print e.chat(''), e.remain

    except ProcessError, error:

        print 'error:', error

运行结果为:

process 01:

Hello world! 0.773000001907

wake up after 100ms 0.549000024796

goodbye 0.547000169754

process 02:

Hello world! 0.868000030518

error: TimeoutError

process 03:

Hello world! 0.868000030518

error: ('Error occurred on loop', ValueError('could not convert string to float: not a num',))

在其中的 process01 中,主进程捕获了 超时

在其中的 process02 中,主进程捕获了 子进程的错误

不知道你能不能用得上

在python里线程出问题,可能会导致主进程崩溃。 虽然python里的线程是操作系统的真实线程。

那么怎么解决呢?通过我们用进程方式。子进程崩溃后,会完全的释放所有的内存和错误状态。所以进程更安全。 另外通过进程,python可以很好的绕过GIL,这个全局锁问题。

但是进程也是有局限的。不要建立超过CPU总核数的进程,否则效率也不高。

简单的总结一下。

当我们想实现多任务处理时,首先要想到使用multiprocessing, 但是如果觉着进程太笨重,那么就要考虑使用线程。 如果多任务处理中需要处理的太多了,可以考虑多进程,每个进程再采用多线程。如果还处理不要,就要使用轮询模式,比如使用poll event, twisted等方式。如果是GUI方式,则要通过事件机制,或者是消息机制处理,GUI使用单线程。

所以在python里线程不要盲目用, 也不要滥用。 但是线程不安全是事实。如果仅仅是做几个后台任务,则可以考虑使用守护线程做。如果需要做一些危险操作,可能会崩溃的,就用子进程去做。 如果需要高度稳定性,同时并发数又不高的服务。则强烈建议用多进程的multiprocessing模块实现。

在linux或者是unix里,进程的使用代价没有windows高。还是可以接受的。