cagney <andrew.cag...@gmail.com> added the comment:
On Fri, 5 Apr 2019 at 05:02, Gregory P. Smith <rep...@bugs.python.org> wrote: > > > Gregory P. Smith <g...@krypto.org> added the comment: > > A stdlib alternative to this whole mess would be to avoid acquiring the > logging locks before fork() as we currently do and just blindly re-initialize > all of them afterwards under the assumption that they "can't" be protecting > anything in a newly forked child process. Handlers that need specific > resource synchronization around fork would then be required to deal with > their own os.register_at_fork() calls. (ex: to avoid multiple processes > writing to the same file or fd at once) FYI, below is a simpler, but related, test. _at_fork_acquire_release_weakset doesn't seem to be locked: Ignoring exception from logging atfork <Handler (NOTSET)> release method: cannot release un-acquired lock Exception ignored in: <function _after_at_fork_weak_calls at 0x7f7307550378> Traceback (most recent call last): File "/home/python/v3.7.3/lib/python3.7/logging/__init__.py", line 269, in _after_at_fork_weak_calls _at_fork_weak_calls('release') File "/home/python/v3.7.3/lib/python3.7/logging/__init__.py", line 254, in _at_fork_weak_calls for instance in _at_fork_acquire_release_weakset: File "/home/python/v3.7.3/lib/python3.7/_weakrefset.py", line 60, in __iter__ for itemref in self.data: RuntimeError: Set changed size during iteration Exception in thread Thread-1: Traceback (most recent call last): File "/home/python/v3.7.3/lib/python3.7/threading.py", line 917, in _bootstrap_inner self.run() File "/home/python/v3.7.3/lib/python3.7/threading.py", line 865, in run self._target(*self._args, **self._kwargs) File "./btc.py", line 11, in lockie h = logging.Handler() File "/home/python/v3.7.3/lib/python3.7/logging/__init__.py", line 824, in __init__ self.createLock() File "/home/python/v3.7.3/lib/python3.7/logging/__init__.py", line 847, in createLock _register_at_fork_acquire_release(self) File "/home/python/v3.7.3/lib/python3.7/logging/__init__.py", line 250, in _register_at_fork_acquire_release _at_fork_acquire_release_weakset.add(instance) File "/home/python/v3.7.3/lib/python3.7/_weakrefset.py", line 83, in add self._commit_removals() File "/home/python/v3.7.3/lib/python3.7/_weakrefset.py", line 56, in _commit_removals discard(l.pop()) IndexError: pop from empty list ---- import logging import os import sys import threading def lockie(): while True: # this adds handle to _at_fork_acquire_release_weakset #sys.stdout.write(".") #sys.stdout.flush() h = logging.Handler() threading.Thread(target=lockie).start() for n in range(0,100000): if n % 100 == 0: sys.stdout.write("%d" % n) sys.stdout.flush() pid = os.fork() if pid != 0: os.wait() else: os._exit(0) ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue36533> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com