Сообщить об ошибке.

Работа с объектами сокетов напрямую из низкоуровнего кода asyncio

В разделе рассмотрены методы цикла событий модуля asyncio, при помощи которых можно работать с открытым сокетом напрямую из низкоуровнего кода.

В основном, реализации протокола, использующие API на основе транспорта, такие как loop.create_connection() и loop.create_server(), быстрее, чем реализации, которые работают с сокетами напрямую. Бывают случаи, когда производительность не критична, а работать с объектами сокетов напрямую удобнее.

Прежде чем что-то делать с циклом событий, его необходимо создать или получить функциями, описанными в разделе "Создание, запуск и получение цикла событий".

Содержание:


loop.sock_recv(sock, nbytes):

Метод loop.sock_recv() получает до n байтов от открытого сокета sock. Асинхронная версия Socket.recv().

Представляет собой сопрограмму. Возвращает полученные данные в виде байтового объекта.

Аргумент sock должен быть неблокирующим сокетом.

Изменено в Python 3.7: несмотря на то, что этот метод всегда был документирован как метод сопрограммы, выпуски до Python 3.7 возвращали Future объект. Начиная с Python 3.7 это метод определен как async def.

loop.sock_recv_into(sock, buf):

Метод loop.sock_recv_into() получает данные из открытого сокета sock в буфер buf. Создан по образцу блокирующего метода Socket.recv_into().

Возвращает количество байтов, записанных в буфер.

Аргумент sock должен быть неблокирующим сокетом.

Новое в Python 3.7

loop.sock_recvfrom(sock, bufsize):

Метод loop.sock_recvfrom() получает дейтаграмму размером до bufsize от sock. Асинхронная версия Socket.recvfrom().

Представляет собой сопрограмму. Возвращает кортеж (полученные данные, удаленный адрес).

Аргумент sock должен быть неблокирующим сокетом.

Новое в версии 3.11.

loop.sock_recvfrom_into(sock, buf, nbytes = 0):

Метод loop.sock_recvfrom_into() получает дейтаграмму размером до n байт из sock в buf. Асинхронная версия Socket.recvfrom_into().

Представляет собой сопрограмму. Возвращает кортеж (количество полученных байтов, удаленный адрес).

Аргумент sock должен быть неблокирующим сокетом.

Новое в версии 3.11.

loop.sock_sendall(sock, data):

Метод loop.sock_sendall() отправляет данные в открытый сокет sock. Асинхронная версия Socket.sendall().

Представляет собой сопрограмму.

Метод loop.sock_sendall() продолжает отправку в сокет до тех пор, пока не будут отправлены все данные data или пока не возникнет ошибка. В случае успеха ничего не возвращается. При ошибке возникает исключение. Кроме того, невозможно определить, сколько данных, если таковые имеются, было успешно обработано принимающей стороной соединения.

Аргумент sock должен быть неблокирующим сокетом.

Изменено в Python 3.7: несмотря на то, что этот метод всегда был документирован как метод сопрограммы, выпуски до Python 3.7 возвращали Future объект. Начиная с Python 3.7 это метод определен как async def.

loop.sock_sendto(sock, data, address):

Метод loop.sock_sendto() отправляет дейтаграмму из sock на address. Асинхронная версия Socket.sendto().

Представляет собой сопрограмму. Возвращает количество отправленных байтов.

Аргумент sock должен быть неблокирующим сокетом.

Новое в версии 3.11.

loop.sock_connect(sock, address):

Метод loop.sock_connect() подключает сокет к удаленному сокету sock по адресу address. Асинхронная версия Socket.connect().

Аргумент sock должен быть неблокирующим сокетом.

Смотрите также низкоуровневый метод loop.create_connection() и высокоуровневую функцию asyncio.open_connection().

loop.sock_accept(sock):

Метод loop.sock_accept() принимает соединение. Создан по образцу блокирующего метода Socket.accept().

Сокет должен быть привязан к адресу и прослушивать соединения. Возвращаемое значение - это пара (conn, address), где conn - это новый объект сокета, который можно использовать для отправки и получения данных в соединении, а address - это адрес, привязанный к сокету на другом конце соединения.

Аргумент sock должен быть неблокирующим сокетом.

Изменено в Python 3.7: несмотря на то, что этот метод всегда был документирован как метод сопрограммы, выпуски до Python 3.7 возвращали Future объект. Начиная с Python 3.7 это метод определен как async def.

Смотрите также низкоуровневый методы loop.create_server() и asyncio.start_server().

loop.sock_sendfile(sock, file, offset=0, count=None, *, fallback=True):

Метод loop.sock_sendfile() отправляет файл, если это возможно, с помощью высокопроизводительного файла os.sendfile. Возвращает общее количество отправленных байтов. Асинхронная версия Socket.sendfile().

Аргумент sock должен быть неблокирующим socket.SOCK_STREAM сокетом.

Аргумент file должен быть обычным файловым объектом, открытым в двоичном режиме mode='rb'.

Аргумент offset сообщает, откуда начать чтение файла. Если указан аргумент count - это общее количество байтов для передачи в отличие от отправки файла до достижения EOF.

Положение указателя файла всегда обновляется, даже если этот метод вызывает ошибку.

Метод file.tell() может использоваться для получения фактического количества отправленных байтов.

Если аргумент fallback=True, то asyncio вручную читает и отправляет файл, когда платформа не поддерживает системный вызов sendfile() (например, Windows или сокет SSL в Unix). Если система не поддерживает системный вызов sendfile(), то возникает исключение asyncio.SendfileNotAvailableError, а так же происходит откат к значению fallback=False.

Новое в Python 3.7