2017-11-21 7 views
2

AWS IoT MQTT 서비스를 사용해야합니다. 현재 https://github.com/aws/aws-iot-device-sdk-python으로 실험하고 있습니다.AWS IoT Python SDK 및 asyncio

내 응용 프로그램은 다른 서비스와 통신하기 위해 웹 소켓을 사용하고 메시지 전달/수신을 위해 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

흠, 디버그 오류가 없습니다. 계속 살펴볼 것입니다. SDK가 어떻게 작동하는지 이해해야합니다. – Giannis