LINUX.ORG.RU

История изменений

Исправление vvn_black, (текущая версия) :

Если в терминах asyncio, то схема такая:

q = asyncio.Queue()

...

while True:
    listener_task = asyncio.ensure_future(transport.receive())
    sender_task = asyncio.ensure_future(q.get())

    done, pending = await asyncio.wait([listener_task, sender_task],
                                       return_when=asyncio.FIRST_COMPLETED)

    if listener_task in done:
        # обработка ответа
        answer = listener_task.result()

    if sender_task in done:
        # шлём команду
        message = sender_task.result()
        transport.send(message)

...
# совсем в другом месте формируем сообщения на отправку
await q.put(message)

P.S. Очень похоже на реализацию работы с вебсокетами.

Исправление vvn_black, :

Если в терминах asyncio, то схема такая:

q = asyncio.Queue()

...

while True:
    listener_task = asyncio.ensure_future(transport.receive())
    sender_task = asyncio.ensure_future(q.get())

    done, pending = await asyncio.wait([listener_task, sender_task],
                                       return_when=asyncio.FIRST_COMPLETED)

    if listener_task in done:
        # обработка ответа
        answer = listener_task.result()

    if sender_task in done:
        # шлём команду
        message = sender_task.result()
        transport.send(message)

...
# совсем в другом месте формируем сообщения на отправку
await q.put(message)

P.S. Очень похоже на реализацию работы с вебсокетами.

Исправление vvn_black, :

Если в терминах asyncio, то схема такая:

q = asyncio.Queue()

...

listener_task = asyncio.ensure_future(transport.receive())
sender_task = asyncio.ensure_future(q.get())

done, pending = await asyncio.wait([listener_task, sender_task],
                                   return_when=asyncio.FIRST_COMPLETED)

    if listener_task in done:
        # обработка ответа
        answer = listener_task.result()

    if sender_task in done:
        # шлём команду
        message = sender_task.result()
        transport.send(message)

...
# совсем в другом месте формируем сообщения на отправку
await q.put(message)

P.S. Очень похоже на реализацию работы с вебсокетами.

Исходная версия vvn_black, :

Если в терминах asyncio, то схема такая:

q = asyncio.Queue()

...

listener_task = asyncio.ensure_future(transport.receive())
sender_task = asyncio.ensure_future(q.get())

done, pending = await asyncio.wait([listener_task, sender_task],
                                   return_when=asyncio.FIRST_COMPLETED)

    if listener_task in done:
        # обработка ответа

    if sender_task in done:
        # шлём команду
        message = sender_task.result()
        transport.send(message)

...
# совсем в другом месте формируем сообщения на отправку
await q.put(message)

P.S. Очень похоже на реализацию работы с вебсокетами.