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

一种是采用轮询串口的方式,例如每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. 简易控制中心,angular的简单使用

    <html> <head> <meta charset='utf-8'> <script src="js/angular.js">& ...

  2. 最短路径算法专题2----Dijkstra

    这个算法适用于求单源最短路径,从一点出发,到其余个点的最短路径. 算法要点: 1.用二维数组存放点到点的距离-----不能相互到达的点用MAX代替距离 2.用dis数组存放源点到任意其他一点的距离-- ...

  3. hdu_5723_Abandoned country(最小生成树)

    题目链接:hdu_5723_Abandoned country 题意: 让你求最小生成树的花费,然后求任给两点的期望路程 题解: 最小生成树大家都会求,Kruskal这里要改改,因为后面要求任意两点的 ...

  4. opentsdb

    http://blog.javachen.com/2014/01/22/all-things-opentsdb.html http://blog.csdn.net/bingjie1217/articl ...

  5. zf-关于收费统计没出来监利县的问题

    这个问题一看就知道跟存储过程有关,所以我直接去后台实现类找到了这个的存储过程 存储过程里第一句就是quhua_code  从 select 开始 就是查询出 4个地方的名字 然后在把这查询出的数据给@ ...

  6. AngularJS Front-End App with Cloud Storage Tutorial Part 1: Building a Minimal App in Seven Steps

    原文 : http://www.codeproject.com/Articles/1027709/AngularJS-Front-End-App-with-Cloud-Storage-Tutoria ...

  7. java实现文件转换成二进制存储与取出

    一.功能描述: 将文件转成二进制数据放入数据库中,需要的时候,便可以取出安装与使用. 二.数据库: 建立一个数据库字段存放转成二进制的图片,这个字段有一个要求就是要设置成blob类型的 CREATE  ...

  8. DWR Annotations

    DWR   Annotations DWR 标注是用来代替 dwr.xml 或者与其一同工作的. 1.初始配置 <servlet> <description>DWR contr ...

  9. UML类图基本画法

    转自:http://www.cnblogs.com/import-this/p/5330501.html 1. 类 类包括属性方法 下图的生命就是属性 代谢就是方法 2.基本关系 a.泛化(Gener ...

  10. (中等) CF 585D Lizard Era: Beginning,中途相遇。

    In the game Lizard Era: Beginning the protagonist will travel with three companions: Lynn, Meliana a ...