SO_REUSEADDR的作用
起因
今天在写东西的时候,用到了多线程。遇到了个问题:
子线程的异常,在父线程中无法捕获。
解决
问题代码
问题代码示例代码如下:
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的作用的更多相关文章
- TCP套接字端口复用SO_REUSEADDR
下面建立的套接字都是tcp套接字 1.进程创建监听套接字socket1,邦定一个指定端口,并接受了若干连接.那么进程创建另外一个套接口socket2,并试图邦定同一个端口时候,bind错误返回“Add ...
- 浅析套接字中SO_REUSEPORT和SO_REUSEADDR的区别
Socket的基本背景 在讨论这两个选项的区别时,我们需要知道的是BSD实现是所有socket实现的起源.基本上其他所有的系统某种程度上都参考了BSD socket实现(或者至少是其接口),然后开始了 ...
- Linux优雅退出问题
问题:Springboot框架开发的项目中会内嵌tomcat容器,在杀死进程的时候tomcat为被正常杀死,导致端口未被释放,第二次启动的时候报端口冲突. 先讲一个基本概念:如何在shell中终止一个 ...
- 实用TCP协议(2):TCP 参数优化
在了解 TCP 的基本机制后本文继续介绍 Linux 内核提供的链接队列.TW_REUSE.SO_REUSEPORT.SYN_COOKIES 等机制以优化生产环境中遇到的性能问题. 连接队列 Linu ...
- setsockopt的作用
功能描述: 获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为了操作套接字层的选项, ...
- setsockopt的作用列表
功能描述: 获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为了操作套接字层的选项,应该 将层的值 ...
- Socket编程中 setsockopt的作用
功能描述: 获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为了操作套接字层的选项,应该 将层的值 ...
- Linux TCP套接字选项 之 SO_REUSEADDR && SO_REUSEPORT
说明 前面从stackoverflow上找了一篇讲这两个选项的文章,文章内容很长,读到最后对Linux中的这两个选项还是有些迷茫,所以重新写一篇文章来做一个总结: 本文只总结TCP单播部分,并且只讨论 ...
- 套接字选项 之 SO_REUSEADDR && SO_REUSEPORT
说明 本文下面内容基本上是截取自stackoverflow,针对这两个选项,在另外一篇文章中做了总结,请移步<Linux TCP套接字选项 之 SO_REUSEADDR && S ...
随机推荐
- TP3.2之WHERE组合条件处理
1.条件都是int类型: $User->where('type=1 AND status=1')->select(); 2.条件包含字符串类型: 使用3.1以上版本的话,使用字符串条件的时 ...
- Java中entity(实体类)的写法规范
在日常的Java项目开发中,entity(实体类)是必不可少的,它们一般都有很多的属性,并有相应的setter和getter方法.entity(实体类)的作用一般是和数据表做映射.所以快速写出规范的e ...
- JAVA常见异常解析
1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...
- Android学习系列(10)--App列表之拖拽ListView(上)
研究了很久的拖拽ListView的实现,受益良多,特此与尔共飨. 鉴于这部分内容网上的资料少而简陋,而具体的实现过程或许对大家才有帮助,为了详尽而不失真,我们一步一步分析,分成两篇文章. ...
- Math.Celing、Math.Floor、Math.DivRem与Math.BigMul
返回大于或等于指定数字的最小整数.例如: double a=Math.Celing(0.00); //0 double a=Math.Celing(0.40); //1 double a=Math ...
- java与数据库交互常用到的一些方法
下面我整理了一下java中常用的几个与数据库交互的常用方法,仅供参考: 1.执行SQL(dao层的实现类中) (1)SQL查询: //import org.hibernate.Query;//impo ...
- scrapy 的一个例子
1.目标: scrapy 是一个爬虫构架,现用一个简单的例子来讲解,scrapy 的使用步骤 2.创建一个scrapy的项目: 创建一个叫firstSpider的项目,命令如下: scrapy sta ...
- Silverlight从客户端上传文件到服务器
这里介绍的是一种利用WebClient手动发送Stream到服务器页面的上传文件方法. 一.服务器接收文件 这里使用一个ASHX页面来接收和保存Silverlight传来的Stream,页面代码如下: ...
- IT人都非常忙(茫)
我发现.身边的盆友都非常忙,要么在加班.要么加班刚回家:要么在出差,要么刚出差回来. 难道搞IT的人都非常忙么?忙还是茫? 大学期间.不知道未来要干什么.非常多人也不清楚应该学习哪些知识和技能.是否须 ...
- 学习笔记之gethostbyname函数
我们现在认知一台计算机主机通常采用直观可读的名字.例如博客园我们会记住 www.cnblogs.com 而不是记住42.121.252.58这个IP.对于大多数的应用程序来说应该是处理名字而不是处理地 ...