这种情况的设计解决方案是什么?

时间:2016-11-03 22:56:13

标签: python software-design

我有以下情况(所有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回调时调用sendMessage

2)在sendMessage()期间的任何时候,如果调用handleAppRestart(),则停止执行sendMessage(),等待handleAppDownloadComplete()被回调并再次调用sendMessage()。

我试过使用threading.events(),但这对我来说似乎很周期。另外,两个回调都是由第三方库提供的,我不能改变它们。有没有更好的方法/设计来处理这种情况?

1 个答案:

答案 0 :(得分:1)

https://docs.python.org/3/library/asyncio-task.html#future(查看示例)

您可以将对sendMessage()的调用建模为可由handleAppRestart()取消的任务。所以你有一个可以绑定任务的类变量任务。

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(消息)?