Неблокирующая розетка connect () внутри asyncio - PullRequest
0 голосов
/ 29 сентября 2018

Здесь - пример того, как сделать неблокирующие соединения сокетов (в качестве клиента) в asyncore.Поскольку этот модуль устарел с рекомендацией 'Deprecated since version 3.6: Please use asyncio instead.' Как это возможно в asyncio?Создание сокета и его подключение внутри сопрограммы работает синхронно и создает проблему, как описано в связанном вопросе.

1 Ответ

0 голосов
/ 29 сентября 2018

Соединение внутри сопрограммы выглядит синхронно с этой сопрограммой, но фактически асинхронно по отношению к циклу событий.Это означает, что вы можете создать любое количество сопрограмм, работающих параллельно, не блокируя друг друга, и в то же время все они выполняются в одном потоке.

Если вы выполняете http, посмотрите на examples parallelзагрузка с использованием aiohttp .Если вам нужны низкоуровневые TCP-соединения, посмотрите примеры в документации и используйте asyncio.gather для их параллельного запуска:

async def talk(host):
    # wait until connection is established, but without blocking
    # other coroutines
    r, w = await asyncio.open_connection(host, 80)
    # use the streams r, w to talk to the server - for example, echo:
    while True:
        line = await r.readline()
        if not line:
            break
        w.write(line)
    w.close()

async def talk_many(hosts):
    coros = [talk(host) for host in hosts]
    await asyncio.gather(*coros)

asyncio.run(talk_many(["host1", "host2", ...])
...