File size: 5,128 Bytes
9273228
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
::: currentmodule
asyncio
:::

# Policies {#asyncio-policies}

:::: warning
::: title
Warning
:::

Policies are deprecated and will be removed in Python 3.16. Users are encouraged to use the `asyncio.run`{.interpreted-text role="func"} function or the `asyncio.Runner`{.interpreted-text role="class"} with *loop_factory* to use the desired loop implementation.
::::

An event loop policy is a global object used to get and set the current `event loop <asyncio-event-loop>`{.interpreted-text role="ref"}, as well as create new event loops. The default policy can be `replaced <asyncio-policy-get-set>`{.interpreted-text role="ref"} with `built-in alternatives <asyncio-policy-builtin>`{.interpreted-text role="ref"} to use different event loop implementations, or substituted by a `custom policy <asyncio-custom-policies>`{.interpreted-text role="ref"} that can override these behaviors.

The `policy object <asyncio-policy-objects>`{.interpreted-text role="ref"} 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 `get_event_loop`{.interpreted-text role="func"}, `set_event_loop`{.interpreted-text role="func"}, and `new_event_loop`{.interpreted-text role="func"}.

Policy objects should implement the APIs defined in the `AbstractEventLoopPolicy`{.interpreted-text role="class"} abstract base class.

## Getting and Setting the Policy {#asyncio-policy-get-set}

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.

::: deprecated
3.14 The `get_event_loop_policy`{.interpreted-text role="func"} function is deprecated and will be removed in Python 3.16.
:::
::::

:::: 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.

::: deprecated
3.14 The `set_event_loop_policy`{.interpreted-text role="func"} function is deprecated and will be removed in Python 3.16.
:::
::::

## Policy Objects {#asyncio-policy-objects}

The abstract event loop policy base class is defined as follows:

:::::::: 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 `AbstractEventLoop`{.interpreted-text role="class"} 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`.
:::

::: deprecated
3.14 The `AbstractEventLoopPolicy`{.interpreted-text role="class"} class is deprecated and will be removed in Python 3.16.
:::
::::::::

::: {#asyncio-policy-builtin}
asyncio ships with the following built-in policies:
:::

:::::: DefaultEventLoopPolicy
The default asyncio policy. Uses `SelectorEventLoop`{.interpreted-text role="class"} on Unix and `ProactorEventLoop`{.interpreted-text role="class"} on Windows.

There is no need to install the default policy manually. asyncio is configured to use the default policy automatically.

::: versionchanged
3.8

On Windows, `ProactorEventLoop`{.interpreted-text role="class"} is now used by default.
:::

::: versionchanged
3.14 The `get_event_loop`{.interpreted-text role="meth"} method of the default asyncio policy now raises a `RuntimeError`{.interpreted-text role="exc"} if there is no set event loop.
:::

::: deprecated
3.14 The `DefaultEventLoopPolicy`{.interpreted-text role="class"} class is deprecated and will be removed in Python 3.16.
:::
::::::

::::: WindowsSelectorEventLoopPolicy
An alternative event loop policy that uses the `SelectorEventLoop`{.interpreted-text role="class"} event loop implementation.

::: availability
Windows.
:::

::: deprecated
3.14 The `WindowsSelectorEventLoopPolicy`{.interpreted-text role="class"} class is deprecated and will be removed in Python 3.16.
:::
:::::

::::: WindowsProactorEventLoopPolicy
An alternative event loop policy that uses the `ProactorEventLoop`{.interpreted-text role="class"} event loop implementation.

::: availability
Windows.
:::

::: deprecated
3.14 The `WindowsProactorEventLoopPolicy`{.interpreted-text role="class"} class is deprecated and will be removed in Python 3.16.
:::
:::::

## Custom Policies {#asyncio-custom-policies}

To implement a new event loop policy, it is recommended to subclass `DefaultEventLoopPolicy`{.interpreted-text role="class"} 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())