起因

今天在写东西的时候,用到了多线程。遇到了个问题:

子线程的异常,在父线程中无法捕获。

解决

问题代码

问题代码示例代码如下:

import threading

class SampleThread(threading.Thread):
def run(self):
raise Exception('An error occured here.') def main():
try:
thread_obj = SampleThread()
thread_obj.start()
except Exception:
print 'catch that' if __name__ == '__main__':
main()

运行结果如下:

Exception in thread Thread-1:
Traceback (most recent call last):
File "E:\installDevelopDirectory\py27\lib\threading.py", line 801, in __bootstrap_inner
self.run()
File "E:/program/ljt_test/test/test_process.py", line 51, in run
raise Exception('An error occured here.')
Exception: An error occured here.

解决办法

通过查看资料:http://stackoverflow.com/questions/2829329/catch-a-threads-exception-in-the-caller-thread-in-python

出现上述问题是因为:执行到 thread_obj.start() 时,父线程就会立即返回结果。然后,生成的子线程在自己独立的上下文中执行,并使用自己的堆栈。子线程发生的任何异常都是在子线程的上下文中,并且它在它自己的堆栈中(独立于父线程)。

所以,解决办法是:将这些信息传递给父线程。代码如下:

#coding=utf-8
import threading
import Queue
import sys
class ExcThread(threading.Thread):
def __init__(self, bucket):
super(ExcThread, self).__init__()
self.bucket = bucket def run(self):
try:
raise Exception('An error occured here.')
# pass
except Exception:
# 异常信息元祖放入队列传递给父进程
self.bucket.put(sys.exc_info()) def main():
bucket = Queue.Queue()
thread_obj = ExcThread(bucket)
thread_obj.start() # 循环获取子线程的异常信息
while 1:
try:
exc = bucket.get(block=False)
except Queue.Empty:#系统已经定义了,可以直接用
pass
else:
exc_type, exc_obj, exc_trace = exc
# deal with the exception
print exc_type, exc_obj
print exc_trace # 防止阻塞
thread_obj.join(0.1)
if thread_obj.isAlive():
continue
else:
break if __name__ == '__main__':
main()

Queue文件中定义的:

https://www.cnblogs.com/xueweihan/p/6653610.html

https://www.cnblogs.com/wt11/p/5952500.html

SO_REUSEADDR的作用的更多相关文章

  1. TCP套接字端口复用SO_REUSEADDR

    下面建立的套接字都是tcp套接字 1.进程创建监听套接字socket1,邦定一个指定端口,并接受了若干连接.那么进程创建另外一个套接口socket2,并试图邦定同一个端口时候,bind错误返回“Add ...

  2. 浅析套接字中SO_REUSEPORT和SO_REUSEADDR的区别

    Socket的基本背景 在讨论这两个选项的区别时,我们需要知道的是BSD实现是所有socket实现的起源.基本上其他所有的系统某种程度上都参考了BSD socket实现(或者至少是其接口),然后开始了 ...

  3. Linux优雅退出问题

    问题:Springboot框架开发的项目中会内嵌tomcat容器,在杀死进程的时候tomcat为被正常杀死,导致端口未被释放,第二次启动的时候报端口冲突. 先讲一个基本概念:如何在shell中终止一个 ...

  4. 实用TCP协议(2):TCP 参数优化

    在了解 TCP 的基本机制后本文继续介绍 Linux 内核提供的链接队列.TW_REUSE.SO_REUSEPORT.SYN_COOKIES 等机制以优化生产环境中遇到的性能问题. 连接队列 Linu ...

  5. setsockopt的作用

    功能描述:        获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为了操作套接字层的选项, ...

  6. setsockopt的作用列表

    功能描述: 获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为了操作套接字层的选项,应该 将层的值 ...

  7. Socket编程中 setsockopt的作用

    功能描述: 获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为了操作套接字层的选项,应该 将层的值 ...

  8. Linux TCP套接字选项 之 SO_REUSEADDR && SO_REUSEPORT

    说明 前面从stackoverflow上找了一篇讲这两个选项的文章,文章内容很长,读到最后对Linux中的这两个选项还是有些迷茫,所以重新写一篇文章来做一个总结: 本文只总结TCP单播部分,并且只讨论 ...

  9. 套接字选项 之 SO_REUSEADDR && SO_REUSEPORT

    说明 本文下面内容基本上是截取自stackoverflow,针对这两个选项,在另外一篇文章中做了总结,请移步<Linux TCP套接字选项 之 SO_REUSEADDR && S ...

随机推荐

  1. 二叉搜索树 C语言实现

    1.二叉搜索树基本概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是一棵具有如下特性的非空二叉树: (1)若它的左子树非空,则左子树上所有结点的关键字均小于根结点的关键字: (2)若它的右子树非 ...

  2. C#中Windows Media Player控件使用实例|方法

    Windows Media Player控件Windows Media Player是一种媒体播放器,可以播放当前最流行的音频.视频文件和大多数混合型的多媒体文件.为了便于程序的开发,Visual S ...

  3. C# NameValueCollection

    一个简单的例子             NameValueCollection markStatus = new NameValueCollection();             string[] ...

  4. python学习笔记——多进程间通信——Linux信号基础

    1 信号的基本描述 Signal信号(其全程为软中断信号)是Linux系统编程中非常重要的概念,信号是异步进程中通信的一种方式. 作用是通知进程发生了异步事件.进程之间可以调用系统来传递信号, 本身内 ...

  5. Android手机在不同分辨率情况下字体自适应大小

    两种解决方法: 一. 1.首先根据不同分辨率获取不同字体大小. 在RES里创建values-480x320/strings.xml 里面设置<dimen name="Text_size ...

  6. Unix环境高级编程(二十)伪终端

    1.综述 伪终端对于一个应用程序而言,看上去像一个终端,但事实上伪终端并不是一个真正的终端.从内核角度看,伪终端看起来像一个双向管道,而事实上Solaris的伪终端就是用STREAMS构建的.伪终端总 ...

  7. EXTJS 5 学习笔记2 - Components

    1. The Components Hierachy 组件体系       2. XTypes and Lazy Instantiation xtype与延迟初始化        1) 每个compo ...

  8. FreeSWITCH检测DTMF数据的方法

    一.RFC2833 1. 介绍: RFC2833为带内检测方式,通过RTP传输,由特殊的rtpPayloadType即TeleponeEvent来标示RFC2833数据包.同一个DTMF按键通常会对应 ...

  9. org.hibernate.MappingException: entity class not found hbm可以解析,但是实体类不能解析

    在hbm.xml中给实体类加上包  com.we.lkl.studentVO

  10. Correlation and Regression

    Correlation and Regression Sample Covariance The covariance between two random variables is a statis ...