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

Мониторинг изменений файловых дескрипторов из низкоуровнего кода asyncio

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

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

Содержание:


loop.add_reader(fd, callback, *args):

Метод loop.add_reader() начинает мониторинг/наблюдение за дескриптором файла fd на предмет доступности чтения и вызывает обратный вызов callback с указанными аргументами *args, как только fd станет доступным для чтения.

Для передачи ключевых аргументов в обратный вызов используйте functools.partial().

loop.remove_reader(fd):

Метод loop.remove_reader() прекращает мониторинг/наблюдение за дескриптором файла fd на предмет доступности чтения.

loop.add_writer(fd, callback, *args):

Метод loop.add_writer() начинает мониторинг/наблюдение за дескриптором файла fd на предмет доступности записи и вызывает обратный вызов callback с указанными аргументами *args, как только fd станет доступным для записи.

Для передачи ключевых аргументов в обратный вызов используйте functools.partial().

loop.remove_writer(fd):

Метод loop.remove_writer() прекращает отслеживать дескриптор файла fd на предмет доступности записи.

Пример отслеживание файлового дескриптора на предмет событий чтения.

В примере будем ждать, пока файловый дескриптор получит какие-то данные, используя метод loop.add_reader(), а затем закроем цикл обработки событий.

import asyncio
from socket import socketpair

# Создание пары связанных файловых дескрипторов
rsock, wsock = socketpair()

loop = asyncio.get_event_loop()

def reader():
    data = rsock.recv(100)
    print("Received:", data.decode())

    # Готово: отменяем регистрацию файлового дескриптора
    loop.remove_reader(rsock)

    # Останавливаем цикл событий
    loop.stop()

# Зарегистрируем дескриптор файла для события чтения
loop.add_reader(rsock, reader)

# Имитация приема данных из сети
loop.call_soon(wsock.send, 'abc'.encode())

try:
    # Запускаем цикл событий
    loop.run_forever()
finally:
    # Готово. Закроем сокеты и цикл событий.
    rsock.close()
    wsock.close()
    loop.close()