2016-10-23 2 views
1

PiFace 보드가 제 라즈베리 파이에 쌓여 있고 버튼 3을 누르면 파이썬 프로그램을 종료하고 싶습니다. 따라서이 버튼에 인터럽트 수신기를 연결하고 loop.stop) 콜백하지만 내 루프가 중지되지 않습니다. 마치 내 명령이 무시되는 것과 같습니다.PiFace & asyncio : 루프가 멈추지 않습니다

내 코드 :

#!/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 그냥 내 정지 전화를받을 수 없습니다. 누구든지 루프를 멈출 수있는 방법을 말해 줄 수 있습니까? 사전에 감사합니다 나는이 코드에서 asyncio 필요, 그것은 바로 차단 missused 것 없기 때문에 당신이 실행 약간의 코 루틴을 가지고 몇 가지 작업을 할 생각

+0

당신이 asyncio가 라즈베리 파이에서 실행하도록되어 확신? (어쩌면 그것은 이유 때문에 라스베리 - 파이가 아니다 : D) –

+0

@ vlad-ardelean 나는 그렇게 생각한다. 왜 안돼? 그 동안 나는'Barrier' 객체로 해결 방법을 시도 할 것입니다. – Reinbert

답변

1

...

그럼에도 불구하고 나는 당신이 확신 해요 스레딩 문제. 모듈에서 GitHub의에서 찾고

:

piface.InputEventListener() 

dreives을 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 
를 사용3210

github pifacecommon

다른 스레드에서 실행되는 것처럼 보입니다. 분명히 stop은 메인 스레드의 asyncio.loop에 도달하지 않습니다.


지금까지 동의합니까?

하나의 스레드에서 스레딩 또는 비동기 프로그래밍을 사용하는 것이 가장 이상적입니다. 데프 onQuit (루프) :

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

또는 functools에서 이 부분 listener.register를 가져 오기 (QUIT_DETECT, piface

그럼에도 불구하고 내가 대신 글로벌 IT를 사용하는 핸드 오버 루프 ​​참조를 사용할 수있을 것입니다 .IODIR_FALLING_EDGE 부분 (onQuit, 루프))


당신이 onQuit에서 대신 사용 내역의 다시 얻을 루프에 시도? asyncio.get_event_loop()

재미 대니 가지고

관련 문제