Python асинхронный: ожидание ввода стандартного ввода при выполнении других вещей - PullRequest
1 голос
/ 18 октября 2019

Я пытаюсь создать клиент командной строки WebSocket, который ожидает сообщений от сервера WebSocket, но одновременно ожидает ввода данных пользователем.

Регулярный опрос нескольких сетевых источников каждую секунду нормально работает на сервере. , (тот, который работает в localhost:6789 в этом примере), но вместо использования обычного sleep() метода Python, он использует asyncio.sleep(), что имеет смысл, потому что спящий и асинхронный спальные не одно и то же, по крайней мере, не подкапот.

Точно так же ожидание пользовательского ввода и асинхронное ожидание пользовательского ввода - это не одно и то же, но я не могу понять, как асинхронно ожидать пользовательского ввода так же, как я могу асинхроннождать произвольное количество секунд, чтобы клиент мог обрабатывать входящие сообщения с сервера WebSocket, одновременно ожидая ввода данных пользователем.

Комментарий ниже в else -пункте monitor_cmd(), надеюсь, объясняетчто я получаю:

import asyncio
import json
import websockets

async def monitor_ws():
    uri = 'ws://localhost:6789'
    async with websockets.connect(uri) as websocket:
        async for message in websocket:
            print(json.dumps(json.loads(message), indent=2, sort_keys=True))

async def monitor_cmd():
    while True:

        sleep_instead = False

        if sleep_instead:
            await asyncio.sleep(1)
            print('Sleeping works fine.')
        else:
            # Seems like I need the equivalent of:
            # line = await asyncio.input('Is this your line? ')
            line = input('Is this your line? ')
            print(line)
try:
    asyncio.get_event_loop().run_until_complete(asyncio.wait([
        monitor_ws(),
        monitor_cmd()
    ]))
except KeyboardInterrupt:
    quit()

Этот код просто ждет вводано бесконечно и больше ничего не делает в то же время, и я понимаю, почему. Что я не понимаю, так это как это исправить. :)

Конечно, если я думаю об этой проблеме неправильно, я был бы очень рад узнать, как исправить это.

1 Ответ

1 голос
/ 19 октября 2019

Вы можете использовать сторонний пакет aioconsole для взаимодействия с stdin в асинхронном режиме:

line = await aioconsole.ainput('Is this your line? ')
...