python - 如何创建一个在每次设置事件时运行函数的事件?

标签 python python-3.x event-handling

我想用 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/

相关文章:

python - 如何通过向交叉熵添加负熵来创建自定义损失函数?

python - Unicode解码错误: 'utf-8' codec can't decode bytes in position 65534-65535: unexpected end of data

event-handling - 如何在 ExtJS 4 中以编程方式触发 keydown 事件

java - 让所有 Kubernetes Pod 监听同一个 Kafka 主题

python - 无法在 python 中调度 com 对象

python 导入 pymongo 失败

python - 自定义断言是否需要 'pass' 语句?

Python 列表 : Why new list object gets created after concatenation operation?

jquery - 如何解码从 jQuery 的 keydown() 事件处理程序中按下的字符

python - 我如何告诉 python 启动用户默认终端?