IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    python线程异常处理

    maplebeats (maplebeats@gmail.com)发表于 2013-02-16 00:00:00
    love 0

    Wrong way

    需要一个线程无限循环来处理事件的时候怎么做呢,以前不知道在哪里学的,我就按下面的代码做了。

    def wrong():
        #Do sth.
        a = threading.Thread(target=wrong)
        a.start()

    这个代码表面上没有任何问题,线程自己调用自己,用起来也没有任何问题:D。我几个月来一直是这么用的,从来没出过什么问题。
    然而当你想捕获异常的时候就会发现问题了。当我想捕获ctrl+c,来保证退出程序之后能处理某些事的时候,用try会直接触发 @ ignored @ 而不是自己想要的结果。

    Right way

    def right():
        while True:
            sth()
    
    def sth():
        #Do sth
        pass

    这样子写就能正确的捕获异常,很容易就能捕获异常了,但是这个没有用来到线程。我在书上还看到了一种写法,我想这个办法应该会更好。上面的写法有一个局限就是程序阻塞在了right这个函数这里无法进行后面的运算。

    def right2():
        c = threading.Thread(target=sth2)
        c.setDaemon(True) #c.daemon = True会更好
        c.start()
        #Do other things
        c.join()
    
    def sth2():
        while True:
            #Do sth
            pass

    因为是while True,所以setDaemon就不足为奇了,join就是保证线程还未完成前主程序就退出了,所以要放到最后。这样子线程就不会阻塞了。

    探究

    测试代码在这里 https://gist.github.com/maplebeats/4965884
    运行结果,ctrl+c下,test1会报ignored错误,test{2,3}输出都为success.
    其实具体的原因我也不了解,粗略的搜了下,有的说是python的bug。还有的说是因为线程捕获异常本来就麻烦,不知道哪个线程会触发。写这个的目的就是抛砖引玉:D



沪ICP备19023445号-2号
友情链接