2016-10-23 4 views
1

У меня есть панель PiFace, уложенная на мой малиновый Pi, и я хочу выйти из моей программы python, когда я нажимаю кнопку 3. Поэтому я подключаю прослушиватель прерываний к этой кнопке и вызываю loop.stop () в обратном вызове, но мой цикл не остановится. Это как если бы мои команды игнорировались.PiFace & asyncio: loop не останавливается

Мой код:

#!/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

вы уверены, что asyncio предполагается запустить на малиновой-пи? (может быть, это не малина-ро по причине: D) –

+0

@ vlad-ardelean Я полагаю, что так. Почему нет? Тем временем я попробую обходной путь с объектом «Барьер». – Reinbert

ответ

1

Я думаю, у вас есть некоторые сопрограмм запущенных и сделать какую-то работу, потому что в этом фрагменте нет необходимости asyncio, это просто missused для блокировки ...

Однако я совершенно уверен, у вас есть a проблема с резьбой.

Глядя на GitHub в модулях:

piface.InputEventListener() 

dreives из pifacecommon.interrupts.PortEventListener

class InputEventListener(pifacecommon.interrupts.PortEventListener): 

github pifacedigitalio

PortEventListener использует Threading и многопроцессорные

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

, похоже, работает в другой теме и вызывает вас. Очевидно, что остановка не достигает asyncio.loop в основной теме.


Согласен, до сих пор?

В идеале вы должны использовать либо потоковое, либо асинхронное программирование в одном потоке.

Тем не менее я надеюсь, что он будет работать в передаче ссылки цикла вместо того, чтобы использовать его глобальное: четкости onQuit (цикл):

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

или из functools импорта частичного listener.register (QUIT_DETECT, piface .IODIR_FALLING_EDGE, частичный (onQuit, петля))


вы пытались повторно получить петлю вместо глобального использования в onQuit? asyncio.get_event_loop()

Весело Дэнни