В многопоточности Python, как завершить подпоток, который находится в состоянии блокировки, когда основной поток получил сигнал SIGINT? - PullRequest
0 голосов
/ 14 ноября 2018

В многопоточности 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)
...