2017-11-21 6 views
2

AWS IoT MQTTサービスを使用する必要があります。私は現在https://github.com/aws/aws-iot-device-sdk-pythonで実験しています。AWS IoT Python SDKとasyncio

私のアプリケーションはWebソケットを使用して別のサービスと通信し、MQTTトピックをパブリッシュ/サブスクライブしてメッセージを転送/受信します。

このライブラリがコード実行をブロックする可能性はありますか?私はまだasyncioの周りに頭を抱えようとしていて、何を探しているべきかはっきりしていません。問題が発生するかどうかはどのように分かりますか?

私は上記のライブラリのAWSIoTMQTTClientを使用する必要があると確信しています。

これは私が持っている作業コードからの抜粋です:

class AWSIoTClient: 

    def __init__(): 
     ... 
     self.client = AWSIoTMQTTClient(...) 

    def subscribe(self, callback): 
     self.client.subscribe(f'{self.TOPIC}/subscribe/', 0, callback) 

    def publish(self, message): 
     self.client.publish(self.TOPIC, message, 0) 


class MyWSProtocol(WebSocketClientProtocol): 

    def set_aws_client(self, client: AWSIoTClient): 
     client.subscribe(self.customCallback) 
     self.client = client 

    def customCallback(self, client, userdata, message): 
     # This will be called when we send message from AWS 
     if message.payload: 
      message = json.loads(message.payload.decode('utf-8').replace("'", '"')) 
      message['id'] = self.next_id() 
      self.sendMessage(json.dumps(message).encode('utf-8')) 

    def onMessage(self, payload, isBinary): 
     message = json.loads(payload) 

     # This will forward message to AWS 
     self.client.publish(str(payload)) 

答えて

1

は、それがこのライブラリは、コードの実行をブロックされる可能性が高いですか?

問題が発生するかどうかわかりますか?

コルーチンの内部で長時間実行されるブロッキング(同期)コードを許可しないでください。グローバルイベントループをブロックし、あらゆるコルーチンをさらにブロックすることにつながります。

async def main(): 
    await asyncio.sleep(3) # async sleeping, it's ok 

    time.sleep(3)   # synchronous sleeping, this freezes event loop 
          # and all coroutines for 3 seconds, 
          # you should avoid it! 

    await asyncio.sleep(3) # async sleeping, it's ok 

あなたはコルーチン内のコードをブロックし実行する必要がある場合は、エグゼキュータ(それについてread here)でそれを行う必要があります。

あなたはコルーチンを書くときに念頭に置いてそれを維持する必要がありますが、あなたはdebug modeを有効にするよ場合は通常、このエラーに関する警告を表示しますasyncio:

import asyncio 
import time 


async def main(): 
    await asyncio.sleep(3) 
    time.sleep(3) 
    await asyncio.sleep(3) 


loop = asyncio.get_event_loop() 
loop.set_debug(True) # debug mode 
try: 
    loop.run_until_complete(main()) 
finally: 
    loop.run_until_complete(loop.shutdown_asyncgens()) 
    loop.close() 

をあなたが警告表示されます:

Executing <Handle <TaskWakeupMethWrapper object at 0x000002063C2521F8>(<Future finis...events.py:275>) created at C:\Users\gmn\AppData\Local\Programs\Python\Python36\Lib\asyncio\futures.py:348> took 3.000 seconds 
+0

デバッグ文を追加します。ありがとうございます – Giannis

+0

Hm、デバッグからのエラーはありません。探し続けると、SDKがそのソースからどのように機能するのかを理解する必要があると思います。 – Giannis