| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. currentmodule:: asyncio
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. _asyncio-policies:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ========
 | 
					
						
							|  |  |  | Policies
 | 
					
						
							|  |  |  | ========
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-26 20:02:23 +05:30
										 |  |  | .. warning::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Policies are deprecated and will be removed in Python 3.16.
 | 
					
						
							|  |  |  |    Users are encouraged to use the :func:`asyncio.run` function
 | 
					
						
							|  |  |  |    or the :class:`asyncio.Runner` with *loop_factory* to use
 | 
					
						
							|  |  |  |    the desired loop implementation.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-28 23:04:49 +05:30
										 |  |  | An event loop policy is a global object
 | 
					
						
							| 
									
										
										
										
											2022-09-27 18:47:14 -05:00
										 |  |  | used to get and set the current :ref:`event loop <asyncio-event-loop>`,
 | 
					
						
							|  |  |  | as well as create new event loops.
 | 
					
						
							|  |  |  | The default policy can be :ref:`replaced <asyncio-policy-get-set>` with
 | 
					
						
							|  |  |  | :ref:`built-in alternatives <asyncio-policy-builtin>`
 | 
					
						
							|  |  |  | to use different event loop implementations,
 | 
					
						
							|  |  |  | or substituted by a :ref:`custom policy <asyncio-custom-policies>`
 | 
					
						
							|  |  |  | that can override these behaviors.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The :ref:`policy object <asyncio-policy-objects>`
 | 
					
						
							|  |  |  | gets and sets a separate event loop per *context*.
 | 
					
						
							|  |  |  | This is per-thread by default,
 | 
					
						
							|  |  |  | though custom policies could define *context* differently.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Custom event loop policies can control the behavior of
 | 
					
						
							|  |  |  | :func:`get_event_loop`, :func:`set_event_loop`, and :func:`new_event_loop`.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | Policy objects should implement the APIs defined
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | in the :class:`AbstractEventLoopPolicy` abstract base class.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-27 18:47:14 -05:00
										 |  |  | .. _asyncio-policy-get-set:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | Getting and Setting the Policy
 | 
					
						
							|  |  |  | ==============================
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | The following functions can be used to get and set the policy
 | 
					
						
							|  |  |  | for the current process:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. function:: get_event_loop_policy()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Return the current process-wide policy.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-14 13:41:39 +02:00
										 |  |  |    .. deprecated:: 3.14
 | 
					
						
							| 
									
										
										
										
											2024-12-18 18:04:20 +05:30
										 |  |  |       The :func:`get_event_loop_policy` function is deprecated and
 | 
					
						
							|  |  |  |       will be removed in Python 3.16.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. function:: set_event_loop_policy(policy)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Set the current process-wide policy to *policy*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    If *policy* is set to ``None``, the default policy is restored.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-14 13:41:39 +02:00
										 |  |  |    .. deprecated:: 3.14
 | 
					
						
							| 
									
										
										
										
											2024-12-18 11:35:29 +05:30
										 |  |  |       The :func:`set_event_loop_policy` function is deprecated and
 | 
					
						
							|  |  |  |       will be removed in Python 3.16.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-27 18:47:14 -05:00
										 |  |  | .. _asyncio-policy-objects:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Policy Objects
 | 
					
						
							|  |  |  | ==============
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The abstract event loop policy base class is defined as follows:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. class:: AbstractEventLoopPolicy
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    An abstract base class for asyncio policies.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. method:: get_event_loop()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Get the event loop for the current context.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Return an event loop object implementing the
 | 
					
						
							|  |  |  |       :class:`AbstractEventLoop` interface.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       This method should never return ``None``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       .. versionchanged:: 3.6
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. method:: set_event_loop(loop)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Set the event loop for the current context to *loop*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. method:: new_event_loop()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Create and return a new event loop object.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       This method should never return ``None``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-14 13:41:39 +02:00
										 |  |  |    .. deprecated:: 3.14
 | 
					
						
							| 
									
										
										
										
											2024-12-24 17:30:26 +05:30
										 |  |  |       The :class:`AbstractEventLoopPolicy` class is deprecated and
 | 
					
						
							|  |  |  |       will be removed in Python 3.16.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-27 18:47:14 -05:00
										 |  |  | .. _asyncio-policy-builtin:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | asyncio ships with the following built-in policies:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. class:: DefaultEventLoopPolicy
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The default asyncio policy.  Uses :class:`SelectorEventLoop`
 | 
					
						
							| 
									
										
										
										
											2018-09-25 08:27:08 -07:00
										 |  |  |    on Unix and :class:`ProactorEventLoop` on Windows.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:09:08 -07:00
										 |  |  |    There is no need to install the default policy manually. asyncio
 | 
					
						
							|  |  |  |    is configured to use the default policy automatically.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-25 08:27:08 -07:00
										 |  |  |    .. versionchanged:: 3.8
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       On Windows, :class:`ProactorEventLoop` is now used by default.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-04 14:21:20 +05:30
										 |  |  |    .. versionchanged:: 3.14
 | 
					
						
							|  |  |  |       The :meth:`get_event_loop` method of the default asyncio policy now
 | 
					
						
							|  |  |  |       raises a :exc:`RuntimeError` if there is no set event loop.
 | 
					
						
							| 
									
										
										
										
											2022-12-06 19:42:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-14 13:41:39 +02:00
										 |  |  |    .. deprecated:: 3.14
 | 
					
						
							| 
									
										
										
										
											2024-12-24 17:30:26 +05:30
										 |  |  |       The :class:`DefaultEventLoopPolicy` class is deprecated and
 | 
					
						
							|  |  |  |       will be removed in Python 3.16.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-25 08:27:08 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. class:: WindowsSelectorEventLoopPolicy
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    An alternative event loop policy that uses the
 | 
					
						
							|  |  |  |    :class:`SelectorEventLoop` event loop implementation.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-12 10:55:20 -04:00
										 |  |  |    .. availability:: Windows.
 | 
					
						
							| 
									
										
										
										
											2018-09-25 08:27:08 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-14 13:41:39 +02:00
										 |  |  |    .. deprecated:: 3.14
 | 
					
						
							| 
									
										
										
										
											2024-12-24 17:30:26 +05:30
										 |  |  |       The :class:`WindowsSelectorEventLoopPolicy` class is deprecated and
 | 
					
						
							|  |  |  |       will be removed in Python 3.16.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. class:: WindowsProactorEventLoopPolicy
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    An alternative event loop policy that uses the
 | 
					
						
							|  |  |  |    :class:`ProactorEventLoop` event loop implementation.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-12 10:55:20 -04:00
										 |  |  |    .. availability:: Windows.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-14 13:41:39 +02:00
										 |  |  |    .. deprecated:: 3.14
 | 
					
						
							| 
									
										
										
										
											2024-12-24 17:30:26 +05:30
										 |  |  |       The :class:`WindowsProactorEventLoopPolicy` class is deprecated and
 | 
					
						
							|  |  |  |       will be removed in Python 3.16.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-27 18:47:14 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. _asyncio-custom-policies:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Custom Policies
 | 
					
						
							|  |  |  | ===============
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To implement a new event loop policy, it is recommended to subclass
 | 
					
						
							|  |  |  | :class:`DefaultEventLoopPolicy` and override the methods for which
 | 
					
						
							|  |  |  | custom behavior is wanted, e.g.::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class MyEventLoopPolicy(asyncio.DefaultEventLoopPolicy):
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def get_event_loop(self):
 | 
					
						
							|  |  |  |             """Get the event loop.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             This may be None or an instance of EventLoop.
 | 
					
						
							|  |  |  |             """
 | 
					
						
							|  |  |  |             loop = super().get_event_loop()
 | 
					
						
							|  |  |  |             # Do something with loop ...
 | 
					
						
							|  |  |  |             return loop
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     asyncio.set_event_loop_policy(MyEventLoopPolicy())
 |