GeezerVison is showing github.com — asyncio: ugly error related to signal handlers at exit if the loop is not closed explicitly · Issue #70321 · python/cpython
asyncio: ugly error related to signal handlers at exit if the loop is not closed explicitly #70321Description
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee = 'https://github.com/asvetlov'
closed_at = <Date 2017-12-24.12:32:05.842>
created_at = <Date 2016-01-16.19:06:06.630>
labels = ['3.7', 'type-crash', 'expert-asyncio']
title = 'asyncio: ugly error related to signal handlers at exit if the loop is not closed explicitly'
updated_at = <Date 2017-12-26.10:29:35.838>
user = 'https://bugs.python.org/AlexBrandt'
bugs.python.org fields:
activity = <Date 2017-12-26.10:29:35.838>
actor = 'asvetlov'
assignee = 'asvetlov'
closed = True
closed_date = <Date 2017-12-24.12:32:05.842>
closer = 'asvetlov'
components = ['asyncio']
creation = <Date 2016-01-16.19:06:06.630>
creator = 'Alex Brandt'
dependencies = []
files = []
hgrepos = []
issue_num = 26133
keywords = ['patch']
message_count = 15.0
messages = ['258401', '258402', '258429', '258432', '259592', '308819', '308828', '308830', '308859', '308875', '308890', '308995', '308996', '309054', '309056']
nosy_count = 6.0
nosy_names = ['gvanrossum', 'vstinner', 'asvetlov', 'yselivanov', 'Alex Brandt', 'hlellelid']
pr_nums = ['4956', '4962', '5002', '5003', '5010', '5014']
priority = 'normal'
resolution = 'fixed'
stage = 'resolved'
status = 'closed'
superseder = None
type = 'crash'
url = 'https://bugs.python.org/issue26133'
versions = ['Python 3.6', 'Python 3.7']
ActivityAlexBrandt commented on Jan 16, 2016 MannequinAuthor More actions When using the suggested practice of setting a stop loop signal handler with:
loop.add_signal_handler(signal.SIGTERM, loop.stop)
The following stack trace is given when the signal runs:
ligament_1 | Exception ignored in: <bound method BaseEventLoop.__del__ of <_UnixSelectorEventLoop running=False closed=True debug=False>>
ligament_1 | Traceback (most recent call last):
ligament_1 | File "/usr/lib/python3.5/asyncio/base_events.py", line 387, in __del__
ligament_1 | File "/usr/lib/python3.5/asyncio/unix_events.py", line 58, in close
ligament_1 | File "/usr/lib/python3.5/asyncio/unix_events.py", line 139, in remove_signal_handler
ligament_1 | File "/usr/lib/python3.5/signal.py", line 47, in signal
ligament_1 | TypeError: signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object
Since this happens during shutdown of the application I wouldn't consider this a high priority bug but it is quite annoying. I've also not investigated if this interrupts the loop stopping procedure yet. gvanrossum commented on Jan 16, 2016 Heh, this is weird. If the signal being removed is SIGTERM, the logic looks like it is definitely going to call signal.signal(signal.SIGTERM, signal.SIG_DFL). And it doesn't look like the signal module's globals have been eradicated yet (or you'd have gotten something like "TypeError: 'NoneType' object is not callable" instead).
You seem to be using Python 3.5.0. Can you repro this with 3.5.1 or with the asyncio from github? Do you have a small self-contained program that repos it? vstinner commented on Jan 16, 2016 The problem is that the signal module has been cleared when the destruction
has been called. You must not rely on destructors but call explicitly close
methods. Please run your app in asyncio debug mode and enable logs. See
asyncio doc. gvanrossum commented on Jan 16, 2016 Victor, if the signal module has been cleared, how could it emit that error
message? signal.signal itself would no longer exist.
(I do agree with the solution you suggest -- though note that it may be
tricky to close the loop from inside the signal callback for SIGTERM, which
is presumably what is going on here.) changed the title [-]TypeError: signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object in <bound method BaseEventLoop.__del__ of <_UnixSelectorEventLoop running=False closed=True debug=False>>[/-] [+]asyncio: ugly error related signal handler at exit if the loop is not closed explicitly[/+] on Jan 19, 2016changed the title [-]asyncio: ugly error related signal handler at exit if the loop is not closed explicitly[/-] [+]asyncio: ugly error related to signal handlers at exit if the loop is not closed explicitly[/+] on Jan 19, 2016hlellelid commented on Feb 4, 2016 FWIW, I am experiencing the issue described here with Python 3.5.1. asvetlov commented on Dec 20, 2017 remove_signal_handler() should do nothing if sys.is_finalizing() is true.
1st1 commented on Dec 20, 2017
remove_signal_handler() should do nothing if sys.is_finalizing() is true.
Probably a good idea.
See also python/asyncio#456. vstinner commented on Dec 20, 2017
remove_signal_handler() should do nothing if sys.is_finalizing() is true.
I dislike this option.
If you want to use sys.is_finalizing(), I would prefer to modify _UnixSelectorEventLoop.close() to not try to remove signal handler if close() has been called too late during Python finalization. But I also expect a warning in this case, not hide bugs silently.
If you reach this case, close() has probably been called by BaseEventLoop.__del__(). asvetlov commented on Dec 21, 2017 Implemented PR 4956 following Victor's suggestion. asvetlov commented on Dec 21, 2017 New changeset 4a02543 by Andrew Svetlov in branch 'master':
bpo-26133: Dont unsubscribe signals in UNIX even loop on interpreter shutdown (bpo-4956)
4a02543 asvetlov commented on Dec 21, 2017 asvetlov commented on Dec 24, 2017 asvetlov commented on Dec 24, 2017 asvetlov commented on Dec 26, 2017 asvetlov commented on Dec 26, 2017
MetadataMetadataDevelopmentNo branches or pull requestsIssue actions
|