2016-11-03 5 views
0

У меня есть следующая ситуация (все 3 функции в классе python), где я должен отправить сообщение на удаленное устройство с двумя обратными вызовами, которые подробно описывают состояние удаленного устройства.Каково конструктивное решение для этой ситуации?

# 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) вызов SendMessage когда handleAppDownloadComplete обратного вызова называется

2) В любой момент SendMessage(), если handleAppRestart() вызывается, прекратить выполнение SendMessage() , подождите, пока handleAppDownloadComplete() будет вызван обратно и снова вызовет sendMessage().

Я попытался использовать threading.events(), но для меня это кажется очень цикличным. И чтобы добавить, оба обратных вызова предоставляются сторонними библиотеками, и я не могу их изменить. Любой лучший способ/дизайн для решения этой ситуации?

ответ

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

Btw что вы дали в вашем вопросе не код Python, и ни мой ответ (Python не использует {}, и я не правильно отступа).

В любом случае, ответ: используйте асинхронные абстракции, чтобы делать то, что вы хотите.

EDIT: Подождите, вы не можете изменить handleAppDownloadComplete(), handleAppRestart() или sendMessage (message)?

+0

Вы правы. Изменен синтаксис. Это на самом деле код python. Опасности кодирования на двух разных языках одновременно. Я могу найти способ добавления/редактирования обратных вызовов, но не может измениться при его вызове. sendMessage (сообщение) может быть полностью изменено. – user1429322

+0

КПП. Asyncio предназначен только для python 3.3 – user1429322