2016-11-03 102 views
0

我有以下情況(所有3個都是python類中的函數),我必須使用2個回調函數向遠程設備發送消息,以提供有關遠程設備狀態的詳細信息。這種情況的設計解決方案是什麼?

# 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) 

我的情況是

1)當handleAppDownloadComplete回調被稱爲

2)在的sendMessage()中的任何時候,如果handleAppRestart()被調用時,停止SendMessage函數執行(調用的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) 
} 

順便說一句,你給你的問題不是Python代碼,也不是我的答案(Python不使用{},我沒有正確縮進)。

無論如何,答案是:使用異步抽象來做你想做的事。編輯:等待,你不能改變handleAppDownloadComplete(),handleAppRestart()或sendMessage(消息)?

+0

你說得對。改變了語法。它實際上是Python代碼。在同一時間以兩種不同語言編碼的危險。我可以找到添加/編輯回調的方法,但在調用回調時無法更改。 sendMessage(消息)可以完全改變。 – user1429322

+0

Btw。 Asyncio僅適用於Python 3.3 – user1429322

相關問題