python多进程卡死_Python 多进程中使用logging导致死锁

当Python多进程中一个线程在logging时,若通过其他线程fork子进程,可能导致子进程因无法获取logging.lock而卡死。问题源于线程锁不跨进程。解决方案包括使用spawn或forkserver启动新进程,避免资源继承。在确定无多线程锁情况下,可谨慎使用fork。
摘要由CSDN通过智能技术生成

这个问题算是个很老问题了,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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值