使用blinker进行异步/多线程处理

3

我有一个树莓派,上面连接了一个4键小键盘。使用blinker的信号库,我将其连接到运行一些方法。

#sender
while True:
    if buttonIsDown == True: signal.send()

#reciever
@signal.connect
def sayHI():
    print("1")
    time.sleep(10)
    print("2")

这个方法运行正常,但是当我第二次按按钮时(在前一次按钮按下的10秒内),由于线程在time.sleep(10)中暂停,它不会触发该方法。

我该如何让它在仍处于暂停状态(可能在另一个线程中)时再次触发该方法?


你能指出@signal.connect装饰器的文档(或你自己的实现),因为我只找到了@signal.connect_via的文档吗? - Adonis
@Adonis 在“通过信号发送和接收数据”示例中提到了 https://pythonhosted.org/blinker/。 - user8162574
1个回答

4

这是一个老问题,但仍然可能对其他人有用。

每次信号发出时,您可以启动一个新线程,以便能够尽快捕获所有事件。请记住,在您的代码中,由于存在 while True,信号从未连接到函数,您应该按相反的顺序定义它们。

以下是基于您的代码的工作示例:

import threading
from blinker import signal
from time import sleep

custom_signal = signal(name='custom')

@custom_signal.connect
def slot(sender):
    def say_hello():
        print("1")
        sleep(10)
        print("2")

    threading.Thread(target=say_hello).start()

while True:
    value = int(input('Press 1 to continue: '))
    if value == 1:
        custom_signal.send()
    else:
        break

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接