Как прервать функцию системного вызова блокировки из обработчика сигнала в Python? - PullRequest
0 голосов
/ 06 января 2019

У меня есть поток, сгенерированный из основного, который имеет в основном бесконечный цикл с функцией системной блокировки: что-то вроде:

def run(self):
    global EXIT
    while not EXIT:
        data = self.conn.recv(1024)
        ...

Я определил обработчик сигнала для SIGINT

def sig_handler(signum, frame):
    global EXIT, threads
    if (signum == 2):#defensive
        print("Called SIGINT")
        EXIT = True

Будучи сигналом, перехваченным основным потоком, он прерывает основной поток. Однако другой поток застрял в функции блокировки: есть ли способ прервать функцию блокировки системных вызовов в python, чтобы выйти из этой функции?

Я не хочу останавливать процесс напрямую, как обычно делает SIGINT, но я хотел бы просто прервать recv, чтобы условие while больше не выполнялось, и я мог сделать другие вещи перед выходом.

...