这个问题算是个很老问题了,09年的issue一直到现在还是open的状态:https://bugs.python.org/issue6721
原因
简单的说,如果主进程A中有多个线程A.t1,A.t2...,而其中有一个线程A.t1刚好在logging,此时线程锁是获取状态(对,logging是通过线程锁实现线程安全的),同时通过另一个线程A.t2 又fork出一个子进程B的话,那么B进程初始化之后,logging.lock会是未释放的状态,此时在B里面尝试logging,B就会卡死,就算A.t1 logging完毕释放了logging.lock,B一样获取不到这个lock,因为这个线程锁不会跨进程,是不同的对象。
代码
import os
import sys
import threading
import time
import multiprocessing
class ThreadWorker(threading.Thread):
def __init__(self):
print('ThreadWorker: init')
super().__init__()
def run(self):
print('ThreadWorker: running (rlock = {0})'.format(global_rlock))
global_rlock.acquire()
print('ThreadWorker: i got lock {0}'.format(global_rlock))
time.sleep(5)