В разделе рассмотрены низкоуровневые методы цикла событий модуля asyncio
, при помощи которых можно наблюдать за доступностью чтения/записи дескриптора файла из низкоуровнего кода.
Прежде чем что-то делать с циклом событий, его необходимо создать или получить функциями, описанными в разделе "Создание, запуск и получение цикла событий".
loop.add_reader()
наблюдает за доступностью чтения из дескриптора,loop.remove_reader()
прекращает мониторинг доступности чтения,loop.add_writer()
наблюдает за доступностью записи в дескриптор,loop.remove_writer()
прекращает мониторинг доступности записи,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()