PiFace& asyncio:循环不会停止

时间:2016-10-23 12:05:17

标签: python raspberry-pi

我有一个PiFace板堆叠到我的Raspberry Pi上,并且当我按下按钮3时想要退出我的python程序。因此我在这个按钮上附加一个中断监听器并在回调中调用loop.stop(),但我的循环赢了不要停。好像我的命令被忽略了。

我的代码:

#!/usr/bin/python3

import pifacedigitalio as piface
import asyncio
import time

QUIT_DETECT = 3

loop = asyncio.get_event_loop()
counter = 0

def onQuit(event):
    # Doesn't stop
    global loop
    loop.stop()
    print(loop)

    # Does change
    global counter
    counter += 1
    print(counter)

piface.init()

listener = piface.InputEventListener()
listener.register(QUIT_DETECT, piface.IODIR_FALLING_EDGE, onQuit)
listener.activate()

loop.run_forever()

loop.close()
listener.deactivate()
piface.deinit()

输出结果为:

<_UnixSelectorEventLoop running=True closed=False debug=False>
1
<_UnixSelectorEventLoop running=True closed=False debug=False>
2
<_UnixSelectorEventLoop running=True closed=False debug=False>
3
<_UnixSelectorEventLoop running=True closed=False debug=False>
4

每次按下时counter都会增加,但loop只是不会停止我的电话。谁能告诉我如何停止循环?提前致谢

1 个答案:

答案 0 :(得分:1)

我想你有一些协同程序正在运行并做一些工作,因为在这个代码片段中不需要asyncio,它只是因为阻塞而错过了...

尽管如此,我确信您有线程问题

在模块中查看gitHub:

piface.InputEventListener()

来自pifacecommon.interrupts.PortEventListener

class InputEventListener(pifacecommon.interrupts.PortEventListener):

github pifacedigitalio

PortEventListener使用线程和多处理

import threading
import multiprocessing
[....]
class PortEventListener(object):
"""Listens for port events and calls the registered functions.
>>> def print_flag(event):
...     print(event.interrupt_flag)
...
>>> port = pifacecommon.mcp23s17.GPIOA
>>> listener = pifacecommon.interrupts.PortEventListener(port)
>>> listener.register(0, pifacecommon.interrupts.IODIR_ON, print_flag)
>>> listener.activate()
"""

TERMINATE_SIGNAL = "astalavista"

def __init__(self, port, chip, return_after_kbdint=True, daemon=False):
    self.port = port
    self.chip = chip
    self.pin_function_maps = list()
    self.event_queue = EventQueue(self.pin_function_maps)
    self.detector = multiprocessing.Process(
        target=watch_port_events,
        args=(
            self.port,
            self.chip,
            self.pin_function_maps,
            self.event_queue,
            return_after_kbdint))
    self.detector.daemon = daemon
    self.dispatcher = threading.Thread(
        target=handle_events,
        args=(
            self.pin_function_maps,
            self.event_queue,
            _event_matches_pin_function_map,
            PortEventListener.TERMINATE_SIGNAL))
    self.dispatcher.daemon = daemon

github pifacecommon

似乎在不同的主题中运行,并回复你。显然,stop并没有到达主线程中的asyncio.loop。

同意,到目前为止?

理想情况下,您应该在一个线程中使用线程或异步编程。

尽管如此,我希望它能够切换循环引用而不是全局使用它:     def onQuit(循环):

listener.register(QUIT_DETECT, piface.IODIR_FALLING_EDGE, onQuit(loop))

或     来自functools import partial     listener.register(QUIT_DETECT,piface.IODIR_FALLING_EDGE,partial(onQuit,loop))

您是否尝试在onQuit中重新获取循环而不是全局使用?    asyncio.get_event_loop()

玩得开心 丹尼