我有以下情况(所有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(),但这对我来说似乎很周期。另外,两个回调都是由第三方库提供的,我不能改变它们。有没有更好的方法/设计来处理这种情况?
答案 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(消息)?