python threading模块中对于信号的抓取

时间:2022-11-07 20:59:57

最近的物联网智能网关(树莓派)项目中遇到这样一个问题:要从多个底层串口读取发来的数据,并且做出相应的处理,对于每个串口的数据的读取我能想到的可以采用两种方式:

一种是采用轮询串口的方式,例如每3s向每个串口的buffer区去取一次数据,但是这样可能会有缓冲区溢出的可能,同时,数据的同步也可能会出现一定的问题,因为数据的上传周期是可以用户自定义的,一旦用户定义的上传周期过短或过长,都可能造成读取的数据出问题。

另一种方式,就是采用多线程方式,把每个串口读取数据放在单独的子线程中,每个子线程阻塞于串口读,后来在测试时发现,由于python的threading模块没有实现对信号的处理,所以当父线程阻塞时,我们需要安装一个信号处理函数,例如,抓取一个Ctrl+C的SIGINT信号的抓取,以方便我们测试程序的退出。下面记录下遇到的坑:

1、在多线程中,首先要把所有的子线程在start之前设置为daemon;

2、如果父线程调用.join()方法实现对自身的阻塞,那么父线程将永远都抓不到目标信号,因此应该要使用isAlive()方法模拟父线程阻塞,然后不断轮询子线程的运行状况;

3、完成对于sig_handler()函数的处理。

实现代码如下:

def blue_thread():
ser_blue = serial.Serial("/dev/ttyUSB0", 9600) # 蓝牙串口
print '\033[31;1m=======蓝牙子线程启动=======\033[0m'
while ser_blue.isOpen():
count = ser_blue.inWaiting()
if count != 0:
recv = ser_blue.read(count)
print recv
# str_handle(recv)
time.sleep(1)
ser_blue.close() def zigbee_thread():
ser_zigbee = serial.Serial("/dev/ttyS0", 115200) # zigbee串口
print '\033[32;1m=======Zigbee子线程启动=======\033[0m'
while ser_zigbee.isOpen():
count = ser_zigbee.inWaiting()
if count != 0:
recv = ser_zigbee.read(count)
print recv
# str_handle(recv)
time.sleep(1)
ser_zigbee.close() def signal_handler(num,frame):
print '\033[33;1m===BYEBYE====\033[0m'
sys.exit(0) def main():
# 由于python的多线程模块没有实现对信号的处理,所以父线程阻塞,我们需要安装一个信号处理函数,能让我们方便退出程序,并且要把子线程设为daemon
signal.signal(signal.SIGINT,signal_handler) threads = []
threads.append(threading.Thread(target=blue_thread,args=()))
threads.append(threading.Thread(target=zigbee_thread,args=()))
for t in threads:
t.setDaemon(True)
t.start()
# t.join()
# 不能使用join,要使用isAlive方法模拟父线程阻塞,不断轮询子线程的运行状况
while True:
alive = False
for t in threads:
alive = alive or t.isAlive()
if alive == True:
break
if not alive:
break if __name__ == "__main__": main()

以上处理方法灵感源自:http://www.jb51.net/article/35165.htm

python threading模块中对于信号的抓取的更多相关文章

  1. python threading模块中的join()方法和setDeamon()方法的一些理解

    之前用多线程的时候看见了很多文章,比较常用的大概就是join()和setDeamon()了. 先说一下自己对join()的理解吧: def join(self, timeout=None): &quo ...

  2. python中threading模块中最重要的Tread类

    Tread是threading模块中的重要类之一,可以使用它来创造线程.其具体使用方法是创建一个threading.Tread对象,在它的初始化函数中将需要调用的对象作为初始化参数传入. 具体代码如下 ...

  3. Python学习笔记- Python threading模块

    Python threading模块 直接调用 # !/usr/bin/env python # -*- coding:utf-8 -*- import threading import time d ...

  4. python threading模块使用 以及python多线程操作的实践(使用Queue队列模块)

    今天花了近乎一天的时间研究python关于多线程的问题,查看了大量源码 自己也实践了一个生产消费者模型,所以把一天的收获总结一下. 由于GIL(Global Interpreter Lock)锁的关系 ...

  5. python threading模块2

    Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading.Thread对 ...

  6. Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺

    更新 其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关评论,含有非匿名旺旺号,快一年了淘宝都没有修复这个. 可就在今天,淘宝把所有的账号设置成了匿名显示,SO,获取非匿名旺旺号已经 ...

  7. Python爬虫工程师必学——App数据抓取实战 ✌✌

    Python爬虫工程师必学——App数据抓取实战 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 爬虫分为几大方向,WEB网页数据抓取.APP数据抓取.软件系统 ...

  8. [Python] 糗事百科文本数据的抓取

    [Python] 糗事百科文本数据的抓取 源码 https://github.com/YouXianMing/QiuShiBaiKeText import sqlite3 import time im ...

  9. python实现列表页数据的批量抓取练手练手的

    python实现列表页数据的批量抓取,练手的,下回带分页的 #!/usr/bin/env python # coding=utf-8 import requests from bs4 import B ...

随机推荐

  1. C 语言

    1, //         char server[] = BaseNetServerIp; //        string  serverStr = _aliNetServerEnabled?Ne ...

  2. win8.1 user profile service 服务登录失败

    在Win 8.1 上新建个用户后,不能登录. 出现 user profile service 服务登录失败. 无法加载用户配置文件. 网上大部分相同提示的问题是有关已有账号不能再次登陆的. 解决方式是 ...

  3. Python基础:新式类的属性访问

    一.概述 二.准备工作 1.讨论对象 2.名词解释 三.实例绑定的属性访问 1.获取属性 一般规则 参考源码 示例验证 2.设置属性 一般规则 参考源码 示例验证 3.删除属性 一般规则 参考源码 示 ...

  4. html --- SVG --- javascript --- 旋转矩形

    可缩放矢量图形(英语:Scalable Vector Graphics,SVG)是基于可扩展标记语言(XML), 用于描述二维矢量图形的一种图形格式.SVG由W3C制定,是一个开放标准. 在 Inte ...

  5. DISCUZ! X2.5设置仅允许QQ登录注册论坛 加固会员注册机制

    论坛稍微有点起色之后,很多站长就会担心论坛经常被人恶意灌水.注册机.顶贴机等等一些列非法的手段.通常站长都会通过一些后台的设置和插件等等一 切有效的方法预防,但更多的站长会通过限制用户注册会员,需注册 ...

  6. CoreLocation框架的使用

    CoreLocation框架使用 一.地图和定位的简介 1.应用场景 周边:找餐馆/找KTV/找电影院(团购APP) 导航:根据用户设定的起点和终点,进行路线规划,并指引用户如何到达(地图APP) 2 ...

  7. 现代3D图形编程学习-设置三角形颜色(译)

    本书系列 现代3D图形变成学习 http://www.cnblogs.com/grass-and-moon/category/920962.html 设置颜色 这一章会对上一章中绘制的三角形进行颜色的 ...

  8. laravel带参数分页

    <!---分页--> <div id="pagination-box"> {{ $list->appends(['mobile'=>$mobil ...

  9. H5的本地存储技术及其与Cookie的比较

    第一部分: H5的本地存储技术 HTML5 提供了两种在客户端存储数据的新方法.先看下面的例子: 例1:var mySelection = {name:"car", amount: ...

  10. ajax事件执行顺序

    1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success(请求成功时调用) 5.ajaxSuccess(全局事件) 6.error 7.aja ...