Author njs
Recipients asvetlov, giampaolo.rodola, gvanrossum, njs, yselivanov
Date 2018-01-26.05:26:59
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1516944420.04.0.467229070634.issue32591@psf.upfronthosting.co.za>
In-reply-to
Content
Right, I *knew* I should be nervous about calling into Python from a C-level destructor... what's happening is:

- Somehow, that coroutine object is managing to survive until the very, very end of the shutdown sequence (PyImport_Cleanup). I'm not sure how exactly; Yury suspects it somehow involves _asynciomodule.c holding a reference.

- At the very end of PyImport_Cleanup, there's a final call to the cycle collector, which destroys the coroutine object

- _PyGen_Finalize notices it's unawaited, and calls _PyErr_WarnUnawaitedCoroutine

- _PyErr_WarnUnawaitedCoroutine attempts to call warnings._warn_unawaited_coroutine, in a very careful and defensive manner

- But it doesn't matter how careful and defensive you are, because at this stage in the shutdown, we have sys.module = None, which freaks out the import system so badly that when we try to look up the warnings module, it doesn't even raise an error, it just abort()s the whole interpreter.

We can get a similar crash by doing:

import sys
async def f(): pass
sys.corocycle = [f]
sys.corocycle.append(sys.corocycle)

If you run the same code on 3.6, then it gets collected at the same time, and it issues a warning using the regular PyErr_WarnEx. It turns out that code is even *more* careful and defensive and notices that the interpreter is being shutdown, so it just skips printing the warning entirely.

I guess what we have to do is add a similar check to _PyErr_WarnUnawaitedCoroutine.

You can imagine how excited I am that I started working on this patch so I could make sure people get more reliable notice of unawaited coroutines (bpo-30491), and not only has that been rejected, but now I'm writing code to explicitly hide unawaited coroutine warnings. Just saying'...
History
Date User Action Args
2018-01-26 05:27:00njssetrecipients: + njs, gvanrossum, giampaolo.rodola, asvetlov, yselivanov
2018-01-26 05:27:00njssetmessageid: <1516944420.04.0.467229070634.issue32591@psf.upfronthosting.co.za>
2018-01-26 05:27:00njslinkissue32591 messages
2018-01-26 05:26:59njscreate