multithreading - 如何在不使用join的情况下向python中的主线程发送信号?

标签 multithreading python-2.7 signals python-multithreading

我试图在多线程程序中将信号从子线程发送到主线程(不能使用多进程)。不幸的是,即使在用尽所有在线可用的阅读 Material (我可以找到)之后,我也无法清楚地了解如何这样做。我是信号和python的初学者,所以请耐心等待并像对新手一样解释。
我不能在进程中使用 join 方法,因为我希望两个线程同时运行。
这是我在这里找到的与该主题相关的代码 - 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()

如果可能,请用多线程示例进行解释。
提前致谢!

最佳答案

信号和线程真的,真的不能很好地一起玩。

考虑使用 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.

关于multithreading - 如何在不使用join的情况下向python中的主线程发送信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25155267/

相关文章:

linux - 需要协助将 python2.7 设置为默认值并安装 Django

linux - mongoDB (result= signal , code = killed , signal = ill

c - 带有长信号处理程序的定时器问题 (SIGALARM)

c - 信号系统调用

C# 套接字异步与多线程

java - 如何在一个@Async中使用不同的执行器

python - 如何将列表中的元素乘以列表中相同的另一个元素,然后检查答案是否在另一个列表中?

multithreading - 与任务并行相比,并行流水线有什么优势?

c - OpenMP 如何处理 C 中的数组?

Python 2.7 os.EX_SOFTWARE 未找到