2016-11-03 9 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) 

私の状況がある

handleAppDownloadCompleteコールバックが )のsendMessage()中の任意の時点では、handleAppRestart()が呼び出された場合、sendMessageをの実行を(停止と呼ばれている1)コールのsendMessage) handleAppDownloadComplete()がコールバックされ、sendMessage()が再び呼び出されるのを待ちます。

私はthreading.events()を使用しようとしましたが、これは私にとって非常に周期的です。追加するには、両方のコールバックが第三者図書館によって提供され、私はそれらを変更することはできません。このような状況に対処するためのよりよい方法/設計?

答えて

1

https://docs.python.org/3/library/asyncio-task.html#futureあなたはhandleAppRestartによってキャンセルすることができタスクとしてのsendMessage()への呼び出しをモデル化することができ

(例を見て)()。つまり、タスクにバインドするクラス変数タスクがあります。 (Pythonは使用しません{}と私は正しくインデントしませんでした)

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のコードではなく、どちらも私の答えではありません。

とにかく、答えは:非同期抽象化を使用して、必要な処理を行います。

EDIT:handleAppDownloadComplete()、handleAppRestart()またはsendMessage(message)を変更できません。

+0

あなたは正しいです。構文を変更しました。実際にはPythonコードです。同時に2つの異なる言語のコーディングの危険性。私はコールバックを追加/編集する方法を見つけることができますが、呼び出されたときに変更することはできません。 sendMessage(メッセージ)は完全に変更できます。 – user1429322

+0

Btw。 AsyncioはPython 3.3のみです – user1429322

関連する問題