Python - 排队一个函数

时间:2016-01-27 00:26:02

标签: python-3.x raspberry-pi listener python-multithreading

我刚开始学习python,但我的代码有问题:

import pifacecad

    # listener initialization
    cad = pifacecad.PiFaceCAD()
    listener = pifacecad.SwitchEventListener(chip=cad)
    listener.register(4, pifacecad.IODIR_ON, blowMyMind)
    listener.activate()

    def blowMyMind(event):
        print('some prints...')
        time.sleep(4)
        print('and the end.')

blowMyMind()将被触发多次,就像它告诉的侦听器一样。好的,可以。 我的目标是停用侦听器UNTIL blowMyMind结束。 Pifacecad建议Barrier()实现这一点,至少我认为它就是出于这个原因(如果我错了,请纠正我)。

现在它在我激活监听器事件的过程中工作了很多次,但它不像是一次推动99次功能,而是排队并逐个运行。

有障碍我觉得它应该是这样的:

# Barrier
global end_barrier
end_barrier = Barrier(1)

# listener initialization
listener = pifacecad.SwitchEventListener(chip=cad)
listener.register(4, pifacecad.IODIR_ON, blowMyMind)
listener.activate()

def blowMyMind(event):
    global end_barrier
    test = end_barrier.wait()
    print(test) # returns 0, which should not in about 5 seconds
    print('some prints...')
    time.sleep(4)
    print('and the end.')

有趣的是,当我在Barrier初始化中更改 party 时,它会在第一个侦听器事件中导致BrokenBarrierError。

实际上我认为我完全误解了Barrier()我认为它的问题是所有的侦听器事件都在一个线程而不是它们自己的线程中。 当我读书时,这让我更加困惑:

  

参与方传递屏障所需的线程数。

从这里开始:https://docs.python.org/3/library/threading.html

我的结论:当初始化Barrier(X)时,如果有X('或更少','或更多'?)线程数,它将被重新发布。这听起来非常愚蠢:D

我试着这样做,没有运气:

# listener initialization
global busy
busy = 0
cad = pifacecad.PiFaceCAD()
listener = pifacecad.SwitchEventListener(chip=cad)
listener.register(4, pifacecad.IODIR_ON, blowMyMind)
listener.activate()

def blowMyMind(event):
    global busy
    if busy == 0:
        busy = 1
        print('some prints...')
        time.sleep(4)
        print('and the end.')
        busy = 0
    else:
        return None

0 个答案:

没有答案