2016-11-03 2 views
0

필자는 원격 장치의 상태에 대한 세부 정보를 제공하는 콜백 2 개를 사용하여 원격 장치에 메시지를 보내야하는 상황 (모두 3 개가 파이썬 클래스의 함수 임)을 가지고 있습니다.이 상황을위한 설계 솔루션은 무엇입니까?

# callback when a app has completed downloaded on a remote device 
def handleAppDownloadComplete(): 
     #something 

# callback when an app has restarted on a remote device 
def handleAppRestart(): 
    # app restart callback 


def sendMessage(message): 

    // Do things like validation etc 
    sendMessageToRemoteDevice(message) 

내 상황이

handleAppDownloadComplete 콜백이

2

) sendMessage 첨부() 동안 어느 시점에서이 handleAppRestart()가 호출되는 경우, sendMessage 첨부의 실행을 (정지이라고 1) 통화 sendMessage 첨부) handleAppDownloadComplete()가 콜백 될 때까지 기다린 후 sendMessage()를 다시 호출하십시오.

나는 threading.events()를 사용해 보았지만, 이것은 매우 순환적인 것처럼 보입니다. 그리고 추가하기 위해 두 콜백은 타사 라이브러리에서 제공하므로 변경할 수 없습니다. 이 상황을 처리하는 더 나은 방법/디자인?

답변

1

https://docs.python.org/3/library/asyncio-task.html#future 당신은 handleAppRestart 취소 할 수있는 작업으로 sendMessage 첨부()에 대한 호출을 모델링 할 수

(예 봐)(). 그래서 당신은 작업에 묶는 클래스 변수 작업을 가지게됩니다. (파이썬은 사용하지 않는 {} 내가 제대로 들여 쓰기를하지 않았다)

import asyncio 
class foo: 
    task = None 
    loop = asyncio.get_event_loop() 
def handleAppDownloadComplete() 
{ 
    task = asyncio.ensure_future(sendMessage(bar)) 
    loop.run_until_complete(tasks) 
} 

# callback when an app has restarted on a remote device 
def handleAppRestart() 
{ 
    task.cancel() 
} 
@asyncio.coroutine 
def sendMessage(message) 
{ 
    // Do things like validation etc 
    sendMessageToRemoteDevice(message) 
} 

는 Btw은 당신이 당신의 질문에 준 것은 파이썬 코드 아니며, 어느 쪽도 내 대답은 없다.

어쨌든 대답은 다음과 같습니다. 원하는대로하려면 비동기 추상화를 사용하십시오.

편집 : 잠깐만, handleAppDownloadComplete(), handleAppRestart() 또는 sendMessage (message)를 변경할 수 없습니까?

+0

당신 말이 맞습니다. 구문을 변경했습니다. 실제로 파이썬 코드입니다. 동시에 2 개의 다른 언어로 코딩의 위험. 콜백을 추가/편집하는 방법을 찾을 수는 있지만 콜백 될 때는 변경할 수 없습니다. sendMessage (메시지)를 완전히 변경할 수 있습니다. – user1429322

+0

Btw. Asyncio는 파이썬 3.3에서만 사용됩니다. – user1429322

관련 문제