Как отправить сигнал в основной поток в python без использования соединения?

Я пытаюсь отправить сигнал из дочернего потока в основной поток в многопоточной программе (не может использовать несколько процессов). К сожалению, даже после исчерпания всех материалов для чтения, доступных в Интернете (которые я смог найти), я не могу получить четкое представление о том, как это сделать. Я новичок в сигналах И Python, поэтому, пожалуйста, потерпите меня и объясните, как новичку. Я не могу использовать метод соединения в процессе, так как хочу, чтобы оба потока работали одновременно. Вот код, который я нашел, связанный с темой здесь - http://pymotw.com/2/signal/#signals-and-threads и у меня это не работает.

import signal
import threading
import os
import time

def signal_handler(num, stack):
    print 'Received signal %d in %s' % (num, threading.currentThread())

signal.signal(signal.SIGUSR1, signal_handler)

def wait_for_signal():
    print 'Waiting for signal in', threading.currentThread()
    signal.pause()
    print 'Done waiting'

# Start a thread that will not receive the signal
receiver = threading.Thread(target=wait_for_signal, name='receiver')
receiver.start()
time.sleep(0.1)

def send_signal():
    print 'Sending signal in', threading.currentThread()
    os.kill(os.getpid(), signal.SIGUSR1)

sender = threading.Thread(target=send_signal, name='sender')
sender.start()
sender.join()

# Wait for the thread to see the signal (not going to happen!)
print 'Waiting for', receiver
signal.alarm(2)
receiver.join()

Пожалуйста, объясните на многопоточном примере, если это возможно. Заранее спасибо!


person Vikraant Singh Sanwal    schedule 06.08.2014    source источник


Ответы (1)


Сигналы и потоки действительно не очень хорошо сочетаются друг с другом.

Рассмотрите возможность использования Event или другого механизма синхронизации. В следующем примере создается объект «событие», а затем он передается двум потокам. Один ждет две секунды, затем сигнализирует другому распечатать сообщение и выйти.

источник

import threading, time

def flagger_thread(event):
    """
    wait for two seconds, then make 'event' fire
    """
    time.sleep(2)
    event.set()

def waiter_thread(event):
    print("Waiting for event")
    if event.wait(5):
        print("event set.")
    else:
        print("Timed out.")

stop_event = threading.Event()
threading.Thread(target=flagger_thread, args=[stop_event]).start()
threading.Thread(target=waiter_thread, args=[stop_event]).start()

# wait for all threads to exit
for t in threading.enumerate():
    if t != threading.current_thread():
        t.join()

выход

Waiting for event
event set.
person johntellsall    schedule 18.08.2014