我有一个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
只是不会停止我的电话。谁能告诉我如何停止循环?提前致谢
答案 0 :(得分:1)
我想你有一些协同程序正在运行并做一些工作,因为在这个代码片段中不需要asyncio,它只是因为阻塞而错过了...
尽管如此,我确信您有线程问题。
在模块中查看gitHub:
piface.InputEventListener()
来自pifacecommon.interrupts.PortEventListener
class InputEventListener(pifacecommon.interrupts.PortEventListener):
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
似乎在不同的主题中运行,并回复你。显然,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()
玩得开心 丹尼