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

I think I have a possible explanation for this now.

In my reproducer script and in the original test, the wakeup file descriptor 
isn't set. I think this explains why the loop isn't waking up to call SIGCHLD's 
handler when the signal comes in. The reason the wakeup file descriptor isn't 
set in the original test is that MultiLoopChildWatcher registers the SIGCHLD 
handler using signal.signal():
https://github.com/python/cpython/blob/74ea6b5a7501fb393cd567fb21998d0bfeeb267c/Lib/asyncio/unix_events.py#L1261-L1267
rather than using loop.add_signal_handler(), which calls signal.set_wakeup_fd():
https://github.com/python/cpython/blob/74ea6b5a7501fb393cd567fb21998d0bfeeb267c/Lib/asyncio/unix_events.py#L95

Is there a reason MultiLoopChildWatcher.attach_loop() isn't calling 
loop.add_signal_handler()? Since attach_loop() has to be called from the main 
thread anyways, it seems like it could be okay.

I also wonder if the documentation could perhaps be more specific as to the 
difference between loop.add_signal_handler() and signal.signal(). Currently, it 
just says callbacks registered with add_signal_handler() are "allowed to 
interact with the event loop":
https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.add_signal_handler
But it doesn't give any warnings about using signal.signal(). For example, it 
might be worth saying something about the possibility of hangs if 
add_signal_handler() isn't used.

----------

_______________________________________
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