Документация Python неофициальный перевод

asyncio-eventloops.md

142 строк · 12.9 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.4/library/asyncio-eventloops.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 18.5.2. Циклы событий89## 18.5.2.1. Функции цикла событий1011Следующие функции – удобные сокращения для доступа к методам глобальной политики. Обратите внимание: они предоставляют доступ к политике по умолчанию, если только в процессе выполнения программы ранее не была установлена другая политика вызовом [`set_event_loop_policy()`](https://python-all.ru/3.4/library/asyncio-eventloops.html#asyncio.set_event_loop_policy).1213#### `asyncio.get_event_loop()`1415Эквивалентно вызову `get_event_loop_policy().get_event_loop()`.1617#### `asyncio.set_event_loop(loop)`1819Эквивалентно вызову `get_event_loop_policy().set_event_loop(loop)`.2021#### `asyncio.new_event_loop()`2223Эквивалентно вызову `get_event_loop_policy().new_event_loop()`.2425## 18.5.2.2. Доступные циклы событий2627asyncio в настоящее время предоставляет две реализации циклов событий: [`SelectorEventLoop`](https://python-all.ru/3.4/library/asyncio-eventloops.html#asyncio.SelectorEventLoop) и [`ProactorEventLoop`](https://python-all.ru/3.4/library/asyncio-eventloops.html#asyncio.ProactorEventLoop).2829#### `class asyncio.SelectorEventLoop`3031Цикл событий на основе модуля [`selectors`](https://python-all.ru/3.4/library/selectors.html#module-selectors). Подкласс [`BaseEventLoop`](https://python-all.ru/3.4/library/asyncio-eventloop.html#asyncio.BaseEventLoop).3233Использует самый эффективный селектор, доступный на платформе.3435В Windows поддерживаются только сокеты (например, каналы не поддерживаются): см. [документацию MSDN по select](https://python-all.ru/3.4/library/asyncio-eventloops.html).3637#### `class asyncio.ProactorEventLoop`3839Proactor-цикл событий для Windows, использующий «I/O Completion Ports» (также известные как IOCP). Подкласс [`BaseEventLoop`](https://python-all.ru/3.4/library/asyncio-eventloop.html#asyncio.BaseEventLoop).4041Доступность: Windows.4243> **См. также**44>45> [документация MSDN по портам завершения ввода-вывода](https://python-all.ru/3.4/library/asyncio-eventloops.html).4647Пример использования [`ProactorEventLoop`](https://python-all.ru/3.4/library/asyncio-eventloops.html#asyncio.ProactorEventLoop) в Windows:4849```python50import asyncio, sys5152if sys.platform == 'win32':53    loop = asyncio.ProactorEventLoop()54    asyncio.set_event_loop(loop)55```5657## 18.5.2.3. Поддержка платформ5859Модуль [`asyncio`](https://python-all.ru/3.4/library/asyncio.html#module-asyncio) спроектирован переносимым, но каждая платформа всё ещё имеет незначительные различия и может не поддерживать все возможности [`asyncio`](https://python-all.ru/3.4/library/asyncio.html#module-asyncio).6061### 18.5.2.3.1. Windows6263Общие ограничения циклов событий Windows:6465- [`create_unix_connection()`](https://python-all.ru/3.4/library/asyncio-eventloop.html#asyncio.BaseEventLoop.create_unix_connection) и [`create_unix_server()`](https://python-all.ru/3.4/library/asyncio-eventloop.html#asyncio.BaseEventLoop.create_unix_server) не поддерживаются: семейство сокетов [`socket.AF_UNIX`](https://python-all.ru/3.4/library/socket.html#socket.AF_UNIX) характерно для UNIX66- [`add_signal_handler()`](https://python-all.ru/3.4/library/asyncio-eventloop.html#asyncio.BaseEventLoop.add_signal_handler) и [`remove_signal_handler()`](https://python-all.ru/3.4/library/asyncio-eventloop.html#asyncio.BaseEventLoop.remove_signal_handler) не поддерживаются67- `EventLoopPolicy.set_child_watcher()` не поддерживается. [`ProactorEventLoop`](https://python-all.ru/3.4/library/asyncio-eventloops.html#asyncio.ProactorEventLoop) поддерживает подпроцессы. У него есть только одна реализация для отслеживания дочерних процессов, настраивать её не нужно.6869Ограничения, характерные для [`SelectorEventLoop`](https://python-all.ru/3.4/library/asyncio-eventloops.html#asyncio.SelectorEventLoop):7071- [`SelectSelector`](https://python-all.ru/3.4/library/selectors.html#selectors.SelectSelector) is used which only supports sockets and is limited to 512 sockets.72- [`add_reader()`](https://python-all.ru/3.4/library/asyncio-eventloop.html#asyncio.BaseEventLoop.add_reader) and [`add_writer()`](https://python-all.ru/3.4/library/asyncio-eventloop.html#asyncio.BaseEventLoop.add_writer) only accept file descriptors of sockets73- Каналы не поддерживаются (например: [`connect_read_pipe()`](https://python-all.ru/3.4/library/asyncio-eventloop.html#asyncio.BaseEventLoop.connect_read_pipe), [`connect_write_pipe()`](https://python-all.ru/3.4/library/asyncio-eventloop.html#asyncio.BaseEventLoop.connect_write_pipe))74- [*Подпроцессы*](https://python-all.ru/3.4/library/asyncio-subprocess.html#asyncio-subprocess) не поддерживаются (например: [`subprocess_exec()`](https://python-all.ru/3.4/library/asyncio-subprocess.html#asyncio.BaseEventLoop.subprocess_exec), [`subprocess_shell()`](https://python-all.ru/3.4/library/asyncio-subprocess.html#asyncio.BaseEventLoop.subprocess_shell))7576Ограничения, характерные для [`ProactorEventLoop`](https://python-all.ru/3.4/library/asyncio-eventloops.html#asyncio.ProactorEventLoop):7778- SSL не поддерживается: [`create_connection()`](https://python-all.ru/3.4/library/asyncio-eventloop.html#asyncio.BaseEventLoop.create_connection) и [`create_server()`](https://python-all.ru/3.4/library/asyncio-eventloop.html#asyncio.BaseEventLoop.create_server) нельзя использовать с SSL, например79- [`create_datagram_endpoint()`](https://python-all.ru/3.4/library/asyncio-eventloop.html#asyncio.BaseEventLoop.create_datagram_endpoint) (UDP) не поддерживается80- [`add_reader()`](https://python-all.ru/3.4/library/asyncio-eventloop.html#asyncio.BaseEventLoop.add_reader) и [`add_writer()`](https://python-all.ru/3.4/library/asyncio-eventloop.html#asyncio.BaseEventLoop.add_writer) не поддерживаются8182Разрешение монотонных часов в Windows обычно составляет около 15,6 мс. Наилучшее разрешение – 0,5 мс. Разрешение зависит от оборудования (наличие [HPET](https://python-all.ru/3.4/library/asyncio-eventloops.html)) и от конфигурации Windows. См. [*отложенные вызовы asyncio*](https://python-all.ru/3.4/library/asyncio-eventloop.html#asyncio-delayed-calls).8384### 18.5.2.3.2. Mac OS X8586Символьные устройства, такие как PTY, хорошо поддерживаются только начиная с Mavericks (Mac OS 10.9). Они вообще не поддерживаются на Mac OS 10.5 и старше.8788В Mac OS 10.6, 10.7 и 10.8 циклом событий по умолчанию является [`SelectorEventLoop`](https://python-all.ru/3.4/library/asyncio-eventloops.html#asyncio.SelectorEventLoop), который использует [`selectors.KqueueSelector`](https://python-all.ru/3.4/library/selectors.html#selectors.KqueueSelector). [`selectors.KqueueSelector`](https://python-all.ru/3.4/library/selectors.html#selectors.KqueueSelector) не поддерживает символьные устройства в этих версиях. [`SelectorEventLoop`](https://python-all.ru/3.4/library/asyncio-eventloops.html#asyncio.SelectorEventLoop) можно использовать с [`SelectSelector`](https://python-all.ru/3.4/library/selectors.html#selectors.SelectSelector) или [`PollSelector`](https://python-all.ru/3.4/library/selectors.html#selectors.PollSelector) для поддержки символьных устройств в этих версиях Mac OS X. Пример:8990```python91import asyncio92import selectors9394selector = selectors.SelectSelector()95loop = asyncio.SelectorEventLoop(selector)96asyncio.set_event_loop(loop)97```9899## 18.5.2.4. Политики цикла событий и политика по умолчанию100101Управление циклом событий абстрагируется с помощью шаблона *политики*, чтобы обеспечить максимальную гибкость для нестандартных платформ и фреймворков. На протяжении выполнения процесса один глобальный объект политики управляет циклами событий, доступными процессу, в зависимости от контекста вызова. Политика – это объект, реализующий интерфейс [`AbstractEventLoopPolicy`](https://python-all.ru/3.4/library/asyncio-eventloops.html#asyncio.AbstractEventLoopPolicy).102103Для большинства пользователей [`asyncio`](https://python-all.ru/3.4/library/asyncio.html#module-asyncio) политики никогда не приходится обрабатывать явно, так как достаточно глобальной политики по умолчанию.104105Политика по умолчанию определяет контекст как текущий поток и управляет циклом событий для каждого потока, который взаимодействует с [`asyncio`](https://python-all.ru/3.4/library/asyncio.html#module-asyncio). Функции уровня модуля [`get_event_loop()`](https://python-all.ru/3.4/library/asyncio-eventloops.html#asyncio.get_event_loop) и [`set_event_loop()`](https://python-all.ru/3.4/library/asyncio-eventloops.html#asyncio.set_event_loop) предоставляют удобный доступ к циклам событий, управляемым политикой по умолчанию.106107## 18.5.2.5. Интерфейс политики цикла событий108109Политика цикла событий должна реализовывать следующий интерфейс:110111#### `class asyncio.AbstractEventLoopPolicy`112113Политика цикла событий.114115#### `get_event_loop()`116117Возвращает цикл событий для текущего контекста.118119Возвращает объект цикла событий, реализующий интерфейс [`BaseEventLoop`](https://python-all.ru/3.4/library/asyncio-eventloop.html#asyncio.BaseEventLoop).120121Вызывает исключение, если для текущего контекста не был установлен цикл событий, а текущая политика не предписывает его создание. Он никогда не должен возвращать `None`.122123#### `set_event_loop(loop)`124125Устанавливает цикл событий для текущего контекста равным *loop*.126127#### `new_event_loop()`128129Создаёт и возвращает новый объект цикла событий в соответствии с правилами этой политики.130131Если необходимо установить этот цикл в качестве цикла событий для текущего контекста, [`set_event_loop()`](https://python-all.ru/3.4/library/asyncio-eventloops.html#asyncio.set_event_loop) должен быть вызван явно.132133## 18.5.2.6. Доступ к глобальной политике цикла134135#### `asyncio.get_event_loop_policy()`136137Возвращает текущую политику цикла событий.138139#### `asyncio.set_event_loop_policy(policy)`140141Устанавливает текущую политику цикла событий. Если *policy* равно `None`, восстанавливается политика по умолчанию.142