gpt4 book ai didi

python - 调用 event.set() 后未通知 threading.Event().wait()

转载 作者:行者123 更新时间:2023-11-30 23:26:20 29 4
gpt4 key购买 nike

我在使用 threading.Event() 时遇到了一个非常奇怪的问题,无法理解发生了什么?我肯定漏掉了一些东西,请你指出来吗?

我有一个监听器类,它与信号处理程序共享相同的事件对象,这是我的简化代码:

import threading, time

class Listener(object):

def __init__(self, event):
super(Listener, self).__init__()
self.event = event

def start(self):
while not self.event.is_set():
print("Listener started, waiting for messages ...")
self.event.wait()

print("Listener is terminated ...")
self.event.clear()

event = threading.Event()

def handler(signum, frame):
global event
event.set()
print('Signal handler called with signal [%s]' % signum)

if __name__ == "__main__":
signal.signal(signal.SIGINT, handler)
listener = Listener(event)
listener.start()

运行代码后,我按 ctrl+c 中断它,但实际上没有任何反应。如果我想退出,我必须使用kill -9来终止进程。但是,如果我向 event.wait() 提供一个参数,它就会起作用。但它不断打印出来:

Listener started, waiting for messages ..."

每个超时秒。但它会打印出:

Listener is terminated ...

按 Ctrl+c 这就是我想要的。

while not self.event.is_set():
print("Listener started, waiting for messages ...")
self.event.wait(1)

为什么我必须在 event.wait() 中给出超时参数才能使其响应 ctrl+c 事件?根据文档http://docs.python.org/2/library/threading.html#event-objects ,一旦标志为 true,调用 wait() 的 event.wait() 线程将根本不会阻塞。顺便说一句,我正在使用 python 2.7.3。

最佳答案

有几个线程讨论与Python的线程、中断、锁、事件相关的问题。

例如,请参阅 herehere ,但还有更多。

Python3 中的情况要好得多,其中改进了 wait() 的实现,使其可中断。

关于python - 调用 event.set() 后未通知 threading.Event().wait(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22587088/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com