python threading模块中对于信号的抓取
最近的物联网智能网关(树莓派)项目中遇到这样一个问题:要从多个底层串口读取发来的数据,并且做出相应的处理,对于每个串口的数据的读取我能想到的可以采用两种方式:
一种是采用轮询串口的方式,例如每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模块中对于信号的抓取的更多相关文章
- python threading模块中的join()方法和setDeamon()方法的一些理解
之前用多线程的时候看见了很多文章,比较常用的大概就是join()和setDeamon()了. 先说一下自己对join()的理解吧: def join(self, timeout=None): &quo ...
- python中threading模块中最重要的Tread类
Tread是threading模块中的重要类之一,可以使用它来创造线程.其具体使用方法是创建一个threading.Tread对象,在它的初始化函数中将需要调用的对象作为初始化参数传入. 具体代码如下 ...
- Python学习笔记- Python threading模块
Python threading模块 直接调用 # !/usr/bin/env python # -*- coding:utf-8 -*- import threading import time d ...
- python threading模块使用 以及python多线程操作的实践(使用Queue队列模块)
今天花了近乎一天的时间研究python关于多线程的问题,查看了大量源码 自己也实践了一个生产消费者模型,所以把一天的收获总结一下. 由于GIL(Global Interpreter Lock)锁的关系 ...
- python threading模块2
Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading.Thread对 ...
- Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺
更新 其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关评论,含有非匿名旺旺号,快一年了淘宝都没有修复这个. 可就在今天,淘宝把所有的账号设置成了匿名显示,SO,获取非匿名旺旺号已经 ...
- Python爬虫工程师必学——App数据抓取实战 ✌✌
Python爬虫工程师必学——App数据抓取实战 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 爬虫分为几大方向,WEB网页数据抓取.APP数据抓取.软件系统 ...
- [Python] 糗事百科文本数据的抓取
[Python] 糗事百科文本数据的抓取 源码 https://github.com/YouXianMing/QiuShiBaiKeText import sqlite3 import time im ...
- python实现列表页数据的批量抓取练手练手的
python实现列表页数据的批量抓取,练手的,下回带分页的 #!/usr/bin/env python # coding=utf-8 import requests from bs4 import B ...
随机推荐
- Android Studio没有导包快捷键怎么办
Android Studio没有导包快捷键,那怎么办呢? 在使用Eclipse开发Android应用时,开发者往往会使用Shift+Ctrl+O快捷键来快速导入所有的包,和移除未使用的包.但这个快捷键 ...
- 卸载get-apt安装的软件
我们都知道安装软件最简单的方法是apt-get install,但是卸载就不常用了,如何卸载呢? sudo apt-get remove android-tools-adb
- MDK的优化应用(转)
源:http://blog.163.com/zhaojun_xf/blog/static/300505802011291384721/ 使用Keil/MDK这么多年了,一直都没有使用它的代码优化功能. ...
- SD卡的SPI模式的初始化顺序(转)
为了使SD卡初始化进入SPI模式,我们需要使用的命令有3个:CMD0,ACMD41,CMD55(使用ACMD类的指令前应先发CMD55,CMD55起到一个切换到ACMD类命令的作用). 为什么在使用C ...
- 有向图强连通分支的Tarjan算法讲解 + HDU 1269 连通图 Tarjan 结题报告
题目很简单就拿着这道题简单说说 有向图强连通分支的Tarjan算法 有向图强连通分支的Tarjan算法伪代码如下:void Tarjan(u) {dfn[u]=low[u]=++index//进行DF ...
- Activity与Service之间交互并播放歌曲的实现代码
Activity与Service之间交互并播放歌曲,为了方便,我把要播放的歌曲定死了,大家可以灵活改进 MService: 复制代码代码如下: package com.tiantian.test;im ...
- C/C++ strtok函数
一.头文件:#include <string.h> 二.函数原型:char * strtok (char *str, const char * delimiters); 三.参数:str, ...
- ptrace
http://zhangwenxin82.blog.163.com/blog/static/114595956201171510512459/
- 使用MyEclipse构建MAVEN项目 - 我的漫漫程序之旅 - BlogJava
body { font-family: Microsoft YaHei UI,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-ser ...
- JS面向对象基础
以往写代码仅仅是为了实现特定的功能,后期维护或别人重用的时候,困难很大. Javascript作为完全面向对象的语言,要写出最优的代码,需要理解对象是如何工作的. 1. 对象是javasc ...