2016-11-03 146 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

相关问题