Python Glossary English

Python 3.4+Асинхронное программированиепонятие

asyncio.Protocol

протоколы и транспорты

Протокол потокового соединения (TCP, Unix-сокет, SSL): цикл вызывает data_received() на каждую порцию байтов и eof_received() в конце.

Синтаксис

transport, protocol = await loop.create_connection(ProtocolClass, host, port)

Учащемуся этот уровень обычно не нужен: для TCP есть потоки asyncio.open_connection() и asyncio.start_server(), для процессов — asyncio.create_subprocess_exec(). Главная ловушка — data_received() не знает границ сообщений: одно отправленное сообщение может прийти двумя кусками, а два — одним, так что буфер и поиск разделителя пишете вы сами (в StreamReader это готовые readline() и readuntil()). Протокол оправдан там, где нужна максимальная скорость без лишних корутин.

Примеры

import asyncio
import socket
class Echo(asyncio.Protocol):
    def connection_made(self, transport):
        self.transport = transport
    def data_received(self, data):
        print('получено', data)  # → получено b'ping'
        self.transport.write(data.upper())
async def main():
    loop = asyncio.get_running_loop()
    left, right = socket.socketpair()  # локальная пара сокетов вместо сети
    transport, proto = await loop.create_connection(Echo, sock=left)
    right.sendall(b'ping')
    await asyncio.sleep(0.01)
    print(right.recv(10))  # → b'PING'
    transport.close()
    right.close()
asyncio.run(main())

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности