我想用 python3 建立一个系统,每次调用事件时都会启动一个函数。我想用 python 重写这段 javascript 代码
const event = new Event('myevent');
// Listen for the event.
elem.addEventListener('myevent', function (e) { /* ... */ }, false);
// Dispatch the event.
elem.dispatchEvent(event);
我写了尝试这段代码,但该函数只运行一次
import threading
import time
event = threading.Event()
x = 0
def myFunction():
global x
event.wait()
if event.is_set():
print("event is set : " + str(x))
x += 1
time.sleep(0.3)
th1 = threading.Thread(target=myFunction)
th1.start()
while True:
event.set()
time.sleep(1)
event.clear()
最佳答案
首先我将发布正确的代码来解决您的问题,然后我将进行解释。
import threading
import time
event = threading.Event()
x = 0
def myFunction():
global x
while True:
event.wait()
if event.is_set():
print("event is set : " + str(x))
x += 1
event.clear()
th1 = threading.Thread(target=myFunction)
th1.start()
while True:
event.set()
time.sleep(1)
事件对象是一种用于线程之间通信的机制。 event.wait()
将等待,直到设置标志以向其订阅的线程发送信号。每次在线程内调用 event.wait()
时,线程都会暂停在那里,直到设置事件的设置标志。
所以如果你想运行
if event.is_set():
print("event is set : " + str(x))
x += 1
重复阻塞,您必须每秒重复调用event.wait()
一次。所以你必须把它放在一个 while 循环中。
你做错的第二个地方是,你试图在你用来设置它的同一个 while 循环中清除该标志。您必须在代码块运行后立即重置该标志。因此,您必须将 event.clear()
放在 x += 1
之后。并从代码中删除 time.sleep(0.3)
行。
结果是
event is set : 0
event is set : 1
event is set : 2
event is set : 3
event is set : 4
event is set : 5
event is set : 6
event is set : 7
event is set : 8
event is set : 9
.......
关于python - 如何创建一个在每次设置事件时运行函数的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72607537/