Ryan Petrello <r...@ryanpetrello.com> added the comment:
Here's the stack of one the hung child processes under py2.7: (gdb) py-bt #4 Waiting for a lock (e.g. GIL) #5 Waiting for a lock (e.g. GIL) #7 Frame 0x7f346a925430, for file /usr/lib64/python2.7/Queue.py, line 118, in put (self=<Queue(unfinished_tasks=147, queue=<collections.deque at remote 0x7f346a908ec0>, maxsize=0, all_tasks_done=<_Condition(_Verbose__verbose=False, _Condition__lock=<thread.lock at remote 0x7f346aa74230>, acquire=<built-in method acquire of thread.lock object at remote 0x7f346aa74230>, _Condition__waiters=[], release=<built-in method release of thread.lock object at remote 0x7f346aa74230>) at remote 0x7f3467df4150>, mutex=<thread.lock at remote 0x7f346aa74230>, not_full=<_Condition(_Verbose__verbose=False, _Condition__lock=<thread.lock at remote 0x7f346aa74230>, acquire=<built-in method acquire of thread.lock object at remote 0x7f346aa74230>, _Condition__waiters=[], release=<built-in method release of thread.lock object at remote 0x7f346aa74230>) at remote 0x7f3467df4110>, not_empty=<_Condition(_Verbose__verbose=False, _Condition__lock=<thread.lock at remote 0x7f346aa74230>, acquire=<built-in method a cquire of thread.lock object ...(truncated) self.not_full.acquire() #11 Frame 0x1ae6ae0, for file /tmp/foo/lib/python2.7/site-packages/concurrent/futures/thread.py, line 129, in submit (self=<ThreadPoolExecutor(_shutdown_lock=<thread.lock at remote 0x7f346aa74270>, _shutdown=False, _max_workers=2, _thread_name_prefix='Thread---Type <return> to continue, or q <return> to quit--- PoolExecutor-0', _threads=set([<...>, <...>]), _work_queue=<...>) at remote 0x7f3467df0f90>, fn=<instancemethod at remote 0x7f3467e01e10>, args=(<LogRecord(threadName='MainThread', name='example', thread=139863104821056, created=<float at remote 0x1a7d580>, process=1155, processName='Process-74', args=(), module='hang', filename='hang.py', levelno=20, exc_text=None, pathname='/tmp/hang.py', lineno=25, msg='exiting', exc_info=None, funcName='exit', relativeCreated=<float at remote 0x1a7d568>, levelname='INFO', msecs=<float at remote 0x1a7d550>) at remote 0x7f346a972490>,), kwargs={}, f=<Future(_exception=None, _result=None, _condition=<_Condition(_Condition__lock=<_RLock(_Verbose__verbose=False, _RLock__owner=None, _RLock__block=<thread.lock at remote 0x7f346aa...(truncated) self._work_queue.put(w) #15 Frame 0x7f3467df15a8, for file /tmp/hang.py, line 16, in handle (self=<ThreadPoolLogger(executor=<ThreadPoolExecutor(_shutdown_lock=<thread.lock at remote 0x7f346aa74270>, _shutdown=False, _max_workers=2, _thread_name_prefix='ThreadPoolExecutor-0', _threads=set([<...>, <...>]), _work_queue=<...>) at remote 0x7f3467df0f90>) at remote 0x7f3467df0f50>, record=<LogRecord(threadName='MainThread', name='example', thread=139863104821056, created=<float at remote 0x1a7d580>, process=1155, processName='Process-74', args=(), module='hang', filename='hang.py', levelno=20, exc_text=None, pathname='/tmp/hang.py', lineno=25, msg='exiting', exc_info=None, funcName='exit', relativeCreated=<f---Type <return> to continue, or q <return> to quit--- loat at remote 0x1a7d568>, levelname='INFO', msecs=<float at remote 0x1a7d550>) at remote 0x7f346a972490>) self.executor.submit(self.send, record) #19 Frame 0x7f346a925240, for file /usr/lib64/python2.7/logging/__init__.py, line 1318, in callHandlers (self=<Logger(name='example', parent=None, handlers=[<ThreadPoolLogger(executor=<ThreadPoolExecutor(_shutdown_lock=<thread.lock at remote 0x7f346aa74270>, _shutdown=False, _max_workers=2, _thread_name_prefix='ThreadPoolExecutor-0', _threads=set([<...>, <...>]), _work_queue=<...>) at remote 0x7f3467df0f90>) at remote 0x7f3467df0f50>], level=10, disabled=0, propagate=1, filters=[]) at remote 0x7f3467de1a90>, record=<LogRecord(threadName='MainThread', name='example', thread=139863104821056, created=<float at remote 0x1a7d580>, process=1155, processName='Process-74', args=(), module='hang', filename='hang.py', levelno=20, exc_text=None, pathname='/tmp/hang.py', lineno=25, msg='exiting', exc_info=None, funcName='exit', relativeCreated=<float at remote 0x1a7d568>, levelname='INFO', msecs=<float at remote 0x1a7d550>) at remote 0x7f346a972490>, c=<...>, found=1, hdlr=<...>) hdlr.handle(record) #22 Frame 0x7f3467df13e0, for file /usr/lib64/python2.7/logging/__init__.py, line 1278, in handle (self=<Logger(name='example', parent=None, handlers=[<ThreadPoolLogger(executor=<ThreadPoolExecutor(_shutdown_lock=<thread.lock at remote 0x7f346aa74270>, _shut---Type <return> to continue, or q <return> to quit--- down=False, _max_workers=2, _thread_name_prefix='ThreadPoolExecutor-0', _threads=set([<...>, <...>]), _work_queue=<...>) at remote 0x7f3467df0f90>) at remote 0x7f3467df0f50>], level=10, disabled=0, propagate=1, filters=[]) at remote 0x7f3467de1a90>, record=<LogRecord(threadName='MainThread', name='example', thread=139863104821056, created=<float at remote 0x1a7d580>, process=1155, processName='Process-74', args=(), module='hang', filename='hang.py', levelno=20, exc_text=None, pathname='/tmp/hang.py', lineno=25, msg='exiting', exc_info=None, funcName='exit', relativeCreated=<float at remote 0x1a7d568>, levelname='INFO', msecs=<float at remote 0x1a7d550>) at remote 0x7f346a972490>) self.callHandlers(record) #25 Frame 0x1ae60e0, for file /usr/lib64/python2.7/logging/__init__.py, line 1268, in _log (self=<Logger(name='example', parent=None, handlers=[<ThreadPoolLogger(executor=<ThreadPoolExecutor(_shutdown_lock=<thread.lock at remote 0x7f346aa74270>, _shutdown=False, _max_workers=2, _thread_name_prefix='ThreadPoolExecutor-0', _threads=set([<...>, <...>]), _work_queue=<...>) at remote 0x7f3467df0f90>) at remote 0x7f3467df0f50>], level=10, disabled=0, propagate=1, filters=[]) at remote 0x7f3467de1a90>, level=20, msg='exiting', args=(), exc_info=None, extra=None, fn='/tmp/hang.py', lno=25, func='exit', record=<LogRecord(threadName='MainThread', name='example', thread=139863104821056, created=<float at remote 0x1a7d580>, process=1155, processName='Process-74', args=(...), ---Type <return> to continue, or q <return> to quit--- Here's the similar stack under py3.6: (gdb) bt #0 0x00007f208166cadb in futex_abstimed_wait (cancel=true, private=<optimized out>, abstime=0x0, expected=0, futex=0x88bbf0) at ../nptl/sysdeps/unix/sysv/linux/sem_waitcommon.c:43 #1 do_futex_wait (sem=sem@entry=0x88bbf0, abstime=0x0) at ../nptl/sysdeps/unix/sysv/linux/sem_waitcommon.c:223 #2 0x00007f208166cb6f in __new_sem_wait_slow (sem=0x88bbf0, abstime=0x0) at ../nptl/sysdeps/unix/sysv/linux/sem_waitcommon.c:292 #3 0x00007f208166cc0b in __new_sem_wait (sem=<optimized out>) at ../nptl/sysdeps/unix/sysv/linux/sem_wait.c:28 #4 0x00007f2081a05a80 in PyThread_acquire_lock_timed (lock=0x88bbf0, microseconds=microseconds@entry=-1, intr_flag=intr_flag@entry=0) at /usr/src/debug/Python-3.6.8/Python/thread_pthread.h:386 #5 0x00007f2081a05c34 in PyThread_acquire_lock (lock=<optimized out>, waitflag=waitflag@entry=1) at /usr/src/debug/Python-3.6.8/Python/thread_pthread.h:595 #6 0x00007f2081918797 in _enter_buffered_busy (self=self@entry=0x7f2081e29b48) at /usr/src/debug/Python-3.6.8/Modules/_io/bufferedio.c:292 #7 0x00007f2081a1f131 in buffered_flush (self=0x7f2081e29b48, args=<optimized out>) at /usr/src/debug/Python-3.6.8/Modules/_io/bufferedio.c:852 ---Type <return> to continue, or q <return> to quit--- #8 0x00007f2081962dd0 in _PyCFunction_FastCallDict ( func_obj=func_obj@entry=0x7f207eb1cb88, args=args@entry=0x0, nargs=0, kwargs=kwargs@entry=0x0) at /usr/src/debug/Python-3.6.8/Objects/methodobject.c:209 #9 0x00007f2081924c46 in _PyObject_FastCallDict (func=func@entry=0x7f207eb1cb88, args=args@entry=0x0, nargs=nargs@entry=0, kwargs=kwargs@entry=0x0) at /usr/src/debug/Python-3.6.8/Objects/abstract.c:2313 #10 0x00007f2081925c66 in callmethod (is_size_t=1, va=0x7ffee1ce4ef0, format=0x0, func=0x7f207eb1cb88) at /usr/src/debug/Python-3.6.8/Objects/abstract.c:2583 ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue37429> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com