Mailing List Archive

Behavior of `asyncio.gather` when one of submitted tasks raises a `KeyboardInterrupt`.
Hi,

regarding this [issue93122](https://github.com/python/cpython/issues/93122), I am wondering what is the normal behavior of `asyncio.gather` when one of the submitted tasks raises a `KeyboardInterrupt` exception ? -- regardless of the value of the `return_exception` parameter.
It seems that this primitive does not behave the same way with `KeyboardInterrupt` and `ZeroDivisionError` exceptions. But may be it is normal ?
I have searched in the documentation [here](https://docs.python.org/3/library/asyncio-task.html#asyncio.gather) but I did not find anything.
Thanks for your help.

Yves
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-leave@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/5KVY7SSDTYWOAOCXVSXNBHCSDEJ5JPP7/
Code of Conduct: http://python.org/psf/codeofconduct/
Re: Behavior of `asyncio.gather` when one of submitted tasks raises a `KeyboardInterrupt`. [ In reply to ]
KeyboardInterrupt is generally not handled properly by asyncio, the normal
behavior here is that the code just exits with a traceback.

On Tue, Jun 7, 2022 at 11:00 AM Yves Duprat <yduprat@gmail.com> wrote:

> Hi,
>
> regarding this [issue93122](https://github.com/python/cpython/issues/93122),
> I am wondering what is the normal behavior of `asyncio.gather` when one of
> the submitted tasks raises a `KeyboardInterrupt` exception ? -- regardless
> of the value of the `return_exception` parameter.
> It seems that this primitive does not behave the same way with
> `KeyboardInterrupt` and `ZeroDivisionError` exceptions. But may be it is
> normal ?
> I have searched in the documentation [here](
> https://docs.python.org/3/library/asyncio-task.html#asyncio.gather) but I
> did not find anything.
> Thanks for your help.
>
> Yves
> _______________________________________________
> Python-Dev mailing list -- python-dev@python.org
> To unsubscribe send an email to python-dev-leave@python.org
> https://mail.python.org/mailman3/lists/python-dev.python.org/
> Message archived at
> https://mail.python.org/archives/list/python-dev@python.org/message/5KVY7SSDTYWOAOCXVSXNBHCSDEJ5JPP7/
> Code of Conduct: http://python.org/psf/codeofconduct/
>


--
--Guido van Rossum (python.org/~guido)
*Pronouns: he/him **(why is my pronoun here?)*
<http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/>
Re: Behavior of `asyncio.gather` when one of submitted tasks raises a `KeyboardInterrupt`. [ In reply to ]
Thank you for the straightforward explanation. May I ask you another question?
I don't understand the behavior of this waiting primitive. So here is the case below:
```py
import asyncio

e = KeyboardInterrupt # or SystemExit
async def sub_task():
raise e

async def main_task():
try:
await asyncio.gather(
# -- aws --
sub_task(),
asyncio.sleep(0)
)
except Exception as e:
print('\tmain_task(), e:', repr(e))
raise
except BaseException as e:
print('\tmain_task(), be:', repr(e))

if __name__ == '__main__':
try:
asyncio.run(main_task())
except e:
print(f'__main__ {e}')
```
When one coroutine `[sub_task()]`, result is:
main_task(), be: CancelledError()
__main__ <class 'KeyboardInterrupt'>

When two coroutines `[sub_task(), sleep(0)]` , result is:
main_task(), be: KeyboardInterrupt()
__main__ <class 'KeyboardInterrupt'>

Why are results so different when `aws` contains single coroutine or two coroutines ?
Thank for your time
Yves

Guido van Rossum wrote:
> KeyboardInterrupt is generally not handled properly by asyncio, the normal
> behavior here is that the code just exits with a traceback.
> On Tue, Jun 7, 2022 at 11:00 AM Yves Duprat yduprat@gmail.com wrote:
> > Hi,
> > regarding this [issue93122](https://github.com/python/cpython/issues/93122),
> > I am wondering what is the normal behavior of `asyncio.gather` when one of
> > the submitted tasks raises a `KeyboardInterrupt` exception ? -- regardless
> > of the value of the `return_exception` parameter.
> > It seems that this primitive does not behave the same way with
> > `KeyboardInterrupt` and `ZeroDivisionError` exceptions. But may be it is
> > normal ?
> > I have searched in the documentation [here](
> > https://docs.python.org/3/library/asyncio-task.html#asyncio.gather) but I
> > did not find anything.
> > Thanks for your help.
> > Yves
> > _______________________________________________
> > Python-Dev mailing list -- python-dev@python.org
> > To unsubscribe send an email to python-dev-leave@python.org
> > https://mail.python.org/mailman3/lists/python-dev.python.org/
> > Message archived at
> > https://mail.python.org/archives/list/python-dev@python.org/message/5KVY7SSD...
> > Code of Conduct: http://python.org/psf/codeofconduct/
> > --
> --Guido van Rossum (python.org/~guido)
> *Pronouns: he/him **(why is my pronoun here?)*
> http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-leave@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/5AHMYI246S6INVUNPJM3KTM2XCRHYNDD/
Code of Conduct: http://python.org/psf/codeofconduct/
Re: Behavior of `asyncio.gather` when one of submitted tasks raises a `KeyboardInterrupt`. [ In reply to ]
Sorry for my imprecision, can you read the changes about the results:
--
With one coroutine in `asyncio.gather([sub_task()])`, result is:
main_task(), be: CancelledError()
__main__ <class 'KeyboardInterrupt'>

With two coroutines `asyncio.gather([sub_task(), asyncio.sleep(0)])` , result is:
main_task(), be: KeyboardInterrupt()
__main__ <class 'KeyboardInterrupt'>
--

Yves Duprat wrote:
> Thank you for the straightforward explanation. May I ask you another question?
> I don't understand the behavior of this waiting primitive. So here is the case below:
> ```py
> import asyncio
> e = KeyboardInterrupt # or SystemExit
> async def sub_task():
> raise e
> async def main_task():
> try:
> await asyncio.gather(
> # -- aws --
> sub_task(),
> asyncio.sleep(0)
> )
> except Exception as e:
> print('\tmain_task(), e:', repr(e))
> raise
> except BaseException as e:
> print('\tmain_task(), be:', repr(e))
> if __name__ == '__main__':
> try:
> asyncio.run(main_task())
> except e:
> print(f'__main__ {e}')
> ```
> When one coroutine `[sub_task()]`, result is:
> main_task(), be: CancelledError()
> __main__ <class 'KeyboardInterrupt'>
> When two coroutines `[sub_task(), sleep(0)]` , result is:
> main_task(), be: KeyboardInterrupt()
> __main__ <class 'KeyboardInterrupt'>
> Why are results so different when `aws` contains single coroutine or two coroutines ?
> Thank for your time
> Yves
> Guido van Rossum wrote:
> > KeyboardInterrupt is generally not handled properly by asyncio, the normal
> > behavior here is that the code just exits with a traceback.
> > On Tue, Jun 7, 2022 at 11:00 AM Yves Duprat yduprat@gmail.com wrote:
> > Hi,
> > regarding this [issue93122](https://github.com/python/cpython/issues/93122),
> > I am wondering what is the normal behavior of `asyncio.gather` when one of
> > the submitted tasks raises a `KeyboardInterrupt` exception ? -- regardless
> > of the value of the `return_exception` parameter.
> > It seems that this primitive does not behave the same way with
> > `KeyboardInterrupt` and `ZeroDivisionError` exceptions. But may be it is
> > normal ?
> > I have searched in the documentation [here](
> > https://docs.python.org/3/library/asyncio-task.html#asyncio.gather) but I
> > did not find anything.
> > Thanks for your help.
> > Yves
> > _______________________________________________
> > Python-Dev mailing list -- python-dev@python.org
> > To unsubscribe send an email to python-dev-leave@python.org
> > https://mail.python.org/mailman3/lists/python-dev.python.org/
> > Message archived at
> > https://mail.python.org/archives/list/python-dev@python.org/message/5KVY7SSD...
> > Code of Conduct: http://python.org/psf/codeofconduct/
> > --
> > --Guido van Rossum (python.org/~guido)
> > *Pronouns: he/him **(why is my pronoun here?)*
> > http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-c...
> >
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-leave@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/CIDCWFDXIQ53745MI3V6S425SRSM6MRY/
Code of Conduct: http://python.org/psf/codeofconduct/
Re: Behavior of `asyncio.gather` when one of submitted tasks raises a `KeyboardInterrupt`. [ In reply to ]
I'm sorry, I don't know the answer. Maybe you can read some of the source
code and report back here if you find any clues?

On Thu, Jun 9, 2022 at 1:53 PM Yves Duprat <yduprat@gmail.com> wrote:

> Sorry for my imprecision, can you read the changes about the results:
> --
> With one coroutine in `asyncio.gather([sub_task()])`, result is:
> main_task(), be: CancelledError()
> __main__ <class 'KeyboardInterrupt'>
>
> With two coroutines `asyncio.gather([sub_task(), asyncio.sleep(0)])` ,
> result is:
> main_task(), be: KeyboardInterrupt()
> __main__ <class 'KeyboardInterrupt'>
> --
>
> Yves Duprat wrote:
> > Thank you for the straightforward explanation. May I ask you another
> question?
> > I don't understand the behavior of this waiting primitive. So here is
> the case below:
> > ```py
> > import asyncio
> > e = KeyboardInterrupt # or SystemExit
> > async def sub_task():
> > raise e
> > async def main_task():
> > try:
> > await asyncio.gather(
> > # -- aws --
> > sub_task(),
> > asyncio.sleep(0)
> > )
> > except Exception as e:
> > print('\tmain_task(), e:', repr(e))
> > raise
> > except BaseException as e:
> > print('\tmain_task(), be:', repr(e))
> > if __name__ == '__main__':
> > try:
> > asyncio.run(main_task())
> > except e:
> > print(f'__main__ {e}')
> > ```
> > When one coroutine `[sub_task()]`, result is:
> > main_task(), be: CancelledError()
> > __main__ <class 'KeyboardInterrupt'>
> > When two coroutines `[sub_task(), sleep(0)]` , result is:
> > main_task(), be: KeyboardInterrupt()
> > __main__ <class 'KeyboardInterrupt'>
> > Why are results so different when `aws` contains single coroutine or two
> coroutines ?
> > Thank for your time
> > Yves
> > Guido van Rossum wrote:
> > > KeyboardInterrupt is generally not handled properly by asyncio, the
> normal
> > > behavior here is that the code just exits with a traceback.
> > > On Tue, Jun 7, 2022 at 11:00 AM Yves Duprat yduprat@gmail.com wrote:
> > > Hi,
> > > regarding this [issue93122](
> https://github.com/python/cpython/issues/93122),
> > > I am wondering what is the normal behavior of `asyncio.gather` when
> one of
> > > the submitted tasks raises a `KeyboardInterrupt` exception ? --
> regardless
> > > of the value of the `return_exception` parameter.
> > > It seems that this primitive does not behave the same way with
> > > `KeyboardInterrupt` and `ZeroDivisionError` exceptions. But may be it
> is
> > > normal ?
> > > I have searched in the documentation [here](
> > > https://docs.python.org/3/library/asyncio-task.html#asyncio.gather)
> but I
> > > did not find anything.
> > > Thanks for your help.
> > > Yves
> > > _______________________________________________
> > > Python-Dev mailing list -- python-dev@python.org
> > > To unsubscribe send an email to python-dev-leave@python.org
> > > https://mail.python.org/mailman3/lists/python-dev.python.org/
> > > Message archived at
> > >
> https://mail.python.org/archives/list/python-dev@python.org/message/5KVY7SSD.
> ..
> > > Code of Conduct: http://python.org/psf/codeofconduct/
> > > --
> > > --Guido van Rossum (python.org/~guido)
> > > *Pronouns: he/him **(why is my pronoun here?)*
> > >
> http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-c.
> ..
> > >
> _______________________________________________
> Python-Dev mailing list -- python-dev@python.org
> To unsubscribe send an email to python-dev-leave@python.org
> https://mail.python.org/mailman3/lists/python-dev.python.org/
> Message archived at
> https://mail.python.org/archives/list/python-dev@python.org/message/CIDCWFDXIQ53745MI3V6S425SRSM6MRY/
> Code of Conduct: http://python.org/psf/codeofconduct/
>


--
--Guido van Rossum (python.org/~guido)
*Pronouns: he/him **(why is my pronoun here?)*
<http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/>
Re: Behavior of `asyncio.gather` when one of submitted tasks raises a `KeyboardInterrupt`. [ In reply to ]
Sure, I will do. Work is in progress !!

Guido van Rossum wrote:
> I'm sorry, I don't know the answer. Maybe you can read some of the source
> code and report back here if you find any clues?
> On Thu, Jun 9, 2022 at 1:53 PM Yves Duprat yduprat@gmail.com wrote:
> > Sorry for my imprecision, can you read the changes about the results:
> > With one coroutine in `asyncio.gather([sub_task()])`, result is:
> > main_task(), be: CancelledError()
> > __main__ <class 'KeyboardInterrupt'>
> > With two coroutines `asyncio.gather([sub_task(), asyncio.sleep(0)])` ,
> > result is:
> > main_task(), be: KeyboardInterrupt()
> > __main__ <class 'KeyboardInterrupt'>
> > --
> > Yves Duprat wrote:
> > Thank you for the straightforward explanation. May I ask you another
> > question?
> > I don't understand the behavior of this waiting primitive. So here is
> > the case below:
> > import asyncio
> > e = KeyboardInterrupt # or SystemExit
> > async def sub_task():
> > raise e
> > async def main_task():
> > try:
> > await asyncio.gather(
> > # -- aws --
> > sub_task(),
> > asyncio.sleep(0)
> > )
> > except Exception as e:
> > print('\tmain_task(), e:', repr(e))
> > raise
> > except BaseException as e:
> > print('\tmain_task(), be:', repr(e))
> > if __name__ == '__main__':
> > try:
> > asyncio.run(main_task())
> > except e:
> > print(f'__main__ {e}')
> >
> > When one coroutine `[sub_task()]`, result is:
> > main_task(), be: CancelledError()
> > __main__ <class 'KeyboardInterrupt'>
> > When two coroutines `[sub_task(), sleep(0)]` , result is:
> > main_task(), be: KeyboardInterrupt()
> > __main__ <class 'KeyboardInterrupt'>
> > Why are results so different when `aws` contains single coroutine or two
> > coroutines ?
> > Thank for your time
> > Yves
> > Guido van Rossum wrote:
> > KeyboardInterrupt is generally not handled properly by asyncio, the
> > normal
> > behavior here is that the code just exits with a traceback.
> > On Tue, Jun 7, 2022 at 11:00 AM Yves Duprat yduprat@gmail.com wrote:
> > Hi,
> > regarding this [issue93122](
> > https://github.com/python/cpython/issues/93122),
> > I am wondering what is the normal behavior of `asyncio.gather` when
> > one of
> > the submitted tasks raises a `KeyboardInterrupt` exception ? --
> > regardless
> > of the value of the `return_exception` parameter.
> > It seems that this primitive does not behave the same way with
> > `KeyboardInterrupt` and `ZeroDivisionError` exceptions. But may be it
> > is
> > normal ?
> > I have searched in the documentation [here](
> > https://docs.python.org/3/library/asyncio-task.html#asyncio.gather)
> > but I
> > did not find anything.
> > Thanks for your help.
> > Yves
> > _______________________________________________
> > Python-Dev mailing list -- python-dev@python.org
> > To unsubscribe send an email to python-dev-leave@python.org
> > https://mail.python.org/mailman3/lists/python-dev.python.org/
> > Message archived at
> > https://mail.python.org/archives/list/python-dev@python.org/message/5KVY7SSD.
> > ..
> > Code of Conduct: http://python.org/psf/codeofconduct/
> > --Guido van Rossum (python.org/~guido)
> > *Pronouns: he/him **(why is my pronoun here?)*
> > http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-c.
> > ..
> >
> > Python-Dev mailing list -- python-dev@python.org
> > To unsubscribe send an email to python-dev-leave@python.org
> > https://mail.python.org/mailman3/lists/python-dev.python.org/
> > Message archived at
> > https://mail.python.org/archives/list/python-dev@python.org/message/CIDCWFDX...
> > Code of Conduct: http://python.org/psf/codeofconduct/
> > --
> --Guido van Rossum (python.org/~guido)
> *Pronouns: he/him **(why is my pronoun here?)*
> http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-leave@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/2TGKUEW5ZBC5ECUHE3AKQ633O2FANGPQ/
Code of Conduct: http://python.org/psf/codeofconduct/