Chris Jerdonek <chris.jerdo...@gmail.com> added the comment:

I looked into this a little after reproducing it locally.

What I found is that MultiLoopChildWatcher._sig_chld() *is* called. It's just 
that it's only called immediately after timeout=5 has elapsed. (The timeout=5 
was added by Andrew here: 
https://github.com/python/cpython/blob/7f7e706d78ab968a1221c6179dfdba714860bd12/Lib/test/test_asyncio/test_subprocess.py#L480
 )

Consider this line in asyncio.tasks.wait_for(), which is to trigger the timeout:
https://github.com/python/cpython/blob/7f7e706d78ab968a1221c6179dfdba714860bd12/Lib/asyncio/tasks.py#L476

  timeout_handle = loop.call_later(timeout, _release_waiter, waiter)

I put some debug statements inside _release_waiter, and I found that 
_sig_chld() is called after the timeout has elapsed and before _release_waiter 
starts. So basically, it looks like CPython is holding onto the signal, and 
waiting for the loop to do something more before running the handler and 
calling the _sig_chld().

The code base already has logic to skip running signal handlers in various 
cases, but I don't know whether it relates to this issue:
https://github.com/python/cpython/blob/7f7e706d78ab968a1221c6179dfdba714860bd12/Python/ceval.c#L1410-L1425

It seems like there are a number of issues on the tracker related to signals 
(some solved and others not, e.g. https://bugs.python.org/issue21895 ). So it 
looks to me like this could point to a deeper issue between asyncio and 
CPython's signal handling.

----------
nosy: +chris.jerdonek

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue38323>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to