Show More
@@ -13,7 +13,7 b' ability to run asynchronous code from the REPL. Constructs which are' | |||||
13 | :exc:`SyntaxError` s in the Python REPL can be used seamlessly in IPython. |
|
13 | :exc:`SyntaxError` s in the Python REPL can be used seamlessly in IPython. | |
14 |
|
14 | |||
15 | The example given here are for terminal IPython, running async code in a |
|
15 | The example given here are for terminal IPython, running async code in a | |
16 |
notebook interface or any other frontend using the Jupyter protocol need |
|
16 | notebook interface or any other frontend using the Jupyter protocol needs | |
17 | IPykernel version 5.0 or above. The details of how async code runs in |
|
17 | IPykernel version 5.0 or above. The details of how async code runs in | |
18 | IPykernel will differ between IPython, IPykernel and their versions. |
|
18 | IPykernel will differ between IPython, IPykernel and their versions. | |
19 |
|
19 | |||
@@ -57,8 +57,8 b' Should behave as expected in the IPython REPL::' | |||||
57 |
|
57 | |||
58 |
|
58 | |||
59 | You can use the ``c.InteractiveShell.autoawait`` configuration option and set it |
|
59 | You can use the ``c.InteractiveShell.autoawait`` configuration option and set it | |
60 |
to :any:`False` to deactivate automatic wrapping of asynchronous code. You can |
|
60 | to :any:`False` to deactivate automatic wrapping of asynchronous code. You can | |
61 | use the :magic:`%autoawait` magic to toggle the behavior at runtime:: |
|
61 | also use the :magic:`%autoawait` magic to toggle the behavior at runtime:: | |
62 |
|
62 | |||
63 | In [1]: %autoawait False |
|
63 | In [1]: %autoawait False | |
64 |
|
64 | |||
@@ -110,9 +110,9 b' In the above example, ``async with`` at top level scope is a syntax error in' | |||||
110 | Python. |
|
110 | Python. | |
111 |
|
111 | |||
112 | Using this mode can have unexpected consequences if used in interaction with |
|
112 | Using this mode can have unexpected consequences if used in interaction with | |
113 |
other features of IPython and various registered extensions. In particular if |
|
113 | other features of IPython and various registered extensions. In particular if | |
114 |
are a direct or indirect user of the AST transformers, these may not apply |
|
114 | you are a direct or indirect user of the AST transformers, these may not apply | |
115 | your code. |
|
115 | to your code. | |
116 |
|
116 | |||
117 | When using command line IPython, the default loop (or runner) does not process |
|
117 | When using command line IPython, the default loop (or runner) does not process | |
118 | in the background, so top level asynchronous code must finish for the REPL to |
|
118 | in the background, so top level asynchronous code must finish for the REPL to | |
@@ -231,25 +231,26 b' Update ipykernel to version 5.0 or greater::' | |||||
231 | conda install ipykernel ipython --upgrade |
|
231 | conda install ipykernel ipython --upgrade | |
232 |
|
232 | |||
233 | This should automatically enable ``autoawait`` integration. Unlike terminal |
|
233 | This should automatically enable ``autoawait`` integration. Unlike terminal | |
234 | IPython all code run on ``asynio`` eventloop, so creating a loop by hand will |
|
234 | IPython, all code runs on ``asynio`` eventloop, so creating a loop by hand will | |
235 | not work, including with magics like ``%run`` or other framework that create |
|
235 | not work, including with magics like ``%run`` or other frameworks that create | |
236 |
the eventloop themselves. In case like th |
|
236 | the eventloop themselves. In case like theses you can try to use projects like | |
237 |
`nest_asyncio <https://github.com/erdewit/nest_asyncio>`_ and see discussion |
|
237 | `nest_asyncio <https://github.com/erdewit/nest_asyncio>`_ and see discussion | |
|
238 | like `this one | |||
238 | <https://github.com/jupyter/notebook/issues/3397#issuecomment-419386811>`_ |
|
239 | <https://github.com/jupyter/notebook/issues/3397#issuecomment-419386811>`_ | |
239 |
|
240 | |||
240 | Difference between terminal IPython and IPykernel |
|
241 | Difference between terminal IPython and IPykernel | |
241 | ================================================= |
|
242 | ================================================= | |
242 |
|
243 | |||
243 |
The exact asynchronous code running behavior |
|
244 | The exact asynchronous code running behavior varies between Terminal IPython and | |
244 |
|
|
245 | IPykernel. The root cause of this behavior is due to IPykernel having a | |
245 |
|
|
246 | _persistent_ ``asyncio`` loop running, while Terminal IPython starts and stop a | |
246 |
|
|
247 | loop for each code block. This can lead to surprising behavior in some case if | |
247 |
|
|
248 | you are used to manipulate asyncio loop yourself, see for example | |
248 | :ghissue:`11303` for a longer discussion but here are some of the astonishing |
|
249 | :ghissue:`11303` for a longer discussion but here are some of the astonishing | |
249 | cases. |
|
250 | cases. | |
250 |
|
251 | |||
251 | This behavior is an implementation detail, and should not be relied upon. It |
|
252 | This behavior is an implementation detail, and should not be relied upon. It can | |
252 |
|
|
253 | change without warnings in future versions of IPython. | |
253 |
|
254 | |||
254 | In terminal IPython a loop is started for each code blocks only if there is top |
|
255 | In terminal IPython a loop is started for each code blocks only if there is top | |
255 | level async code:: |
|
256 | level async code:: | |
@@ -283,8 +284,8 b' In a Notebook, with ipykernel the asyncio eventloop is always running::' | |||||
283 | In [3]: loop1 is loop2 |
|
284 | In [3]: loop1 is loop2 | |
284 | Out[3]: True |
|
285 | Out[3]: True | |
285 |
|
286 | |||
286 | In Terminal IPython background task are only processed while the foreground |
|
287 | In Terminal IPython background tasks are only processed while the foreground | |
287 |
task is running, |
|
288 | task is running, if and only if the foreground task is async:: | |
288 |
|
289 | |||
289 | $ ipython |
|
290 | $ ipython | |
290 | In [1]: import asyncio |
|
291 | In [1]: import asyncio | |
@@ -313,4 +314,4 b' task is running, and IIF the foreground task is async::' | |||||
313 | background 6 |
|
314 | background 6 | |
314 |
|
315 | |||
315 | In a Notebook, QtConsole, or any other frontend using IPykernel, background |
|
316 | In a Notebook, QtConsole, or any other frontend using IPykernel, background | |
316 | task should behave as expected. |
|
317 | tasks should behave as expected. |
General Comments 0
You need to be logged in to leave comments.
Login now