Какая сопрограмма является последовательной? - PullRequest
2 голосов
/ 20 октября 2019

Я изучаю документы HBMQTT по адресу hbmqtt , и есть 2 функции, которые делают одно и то же, в основном, для публикации 3 сообщений брокеру MQTT:

@asyncio.coroutine
def test_coro():
    C = MQTTClient()
    yield from C.connect('mqtt://test.mosquitto.org/')
    tasks = [
        asyncio.ensure_future(C.publish('a/b', b'TEST MESSAGE WITH QOS_0')),
        asyncio.ensure_future(C.publish('a/b', b'TEST MESSAGE WITH QOS_1', qos=QOS_1)),
        asyncio.ensure_future(C.publish('a/b', b'TEST MESSAGE WITH QOS_2', qos=QOS_2)),
    ]
    yield from asyncio.wait(tasks)
    logger.info("messages published")
    yield from C.disconnect()


@asyncio.coroutine
def test_coro2():
    try:
        C = MQTTClient()
        ret = yield from C.connect('mqtt://test.mosquitto.org:1883/')
        message = yield from C.publish('a/b', b'TEST MESSAGE WITH QOS_0', qos=QOS_0)
        message = yield from C.publish('a/b', b'TEST MESSAGE WITH QOS_1', qos=QOS_1)
        message = yield from C.publish('a/b', b'TEST MESSAGE WITH QOS_2', qos=QOS_2)
        #print(message)
        logger.info("messages published")
        yield from C.disconnect()
    except ConnectException as ce:
        logger.error("Connection failed: %s" % ce)
        asyncio.get_event_loop().stop()

Документыпродолжайте описывать их как:

test_coro () публиковать 3 сообщения в последовательности. test_coro2 () публикует то же сообщение асинхронно.

Это не имеет смысла, так как я также изучаю asyncio и, насколько я понимаю, ensure_future() планирует задачи для асинхронного запуска, тогда как yield from кажетсяслужить той же цели, что и await, и, таким образом, каждое из этих утверждений будет просто блокироваться до тех пор, пока задача не будет завершена. Так что описание должно быть наоборот. Я прав или что-то упустил?

1 Ответ

2 голосов
/ 20 октября 2019

Да, имена сопрограмм поменялись местами и должны быть наоборот.

Более того: код устарел. т.е.

  • Больше нет необходимости отмечать функции как сопрограммы с таким декоратором, просто используйте ключевое слово async.

  • useawait вместо yield from

...