在python多线程中,只有主线程能接收到信号,而且不能使用join阻塞,
那么主线程接收到信号后怎么结束正在阻塞状态中的子线程呢
如下代码子线程receive_task1
正阻塞在os.read()
(接收串口数据,串口没有收到数据)函数中,有没有什么办法让os.read()
函数退出呢?
如果在主线程中使用os.read()
,默认情况可以使用Ctrl+C
打断,现在这种情况如何做最佳?
import os
import signal
import threading
import time
def test(signum, frame):
print("\nreceived sig %d" % (signum))
print("how to make os.read(...) in rcv_task1 thread stop? ")
print("except use sys.exit(1)")
def receive_task1():
fd = os.open("/dev/ttyUSB1", os.O_RDWR)
os.read(fd, 10)
print("receive thread end")
signal.signal(signal.SIGINT, test)
rcv_task1 = threading.Thread(target=receive_task1)
rcv_task1.setDaemon(True)
rcv_task1.start()
while(1):
time.sleep(1)
我只学过socket库,不熟悉os库。以我目前掌握的知识,解决办法有两个:
1、改成多进程模式,然后在主进程中terminate掉子进程即可;
2、将子线程中的文件描述符fd设置成非阻塞模式,正好查到os库中有os.set_blocking(fd, blocking)函数可供使用。
代码大致如下(我没在Linux下测试过):