python多进程卡死_Python 多进程中使用logging导致死锁
这个问题算是个很老问题了,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)
global_rlock.release()
print('ThreadWorker: release lock {0} and '
'sleeping forever'.format(global_rlock))
time.sleep(600000)
def foo(global_rlock):
print('child: running (rlock = {0}), '
'getting the lock...'.format(global_rlock))
global_rlock.acquire()
print('child: got the lock {0}'.format(global_rlock))
sys.exit(0)
if __name__ == '__main__':
global_rlock = threading.RLock(verbose=True)
worker = ThreadWorker()
worker.daemon = True
worker.start()
time.sleep(1)
print('forking')
context = multiprocessing.get_context('fork')
process = context.Process(target=foo, args=(global_rlock,)) # in unix ,the default context is fork.
process.start()
print('parent: running (rlock = {0})'.format(global_rlock))
time.sleep(10)
解决方案
首先在windows上是不会有这个问题的,windows根本不支持fork,windows只支持以spawn方式去新起一个进程。
Unix才会有这个问题,但谁家的生产环境还会是windows呢?
见节 17.2.1.2:https://docs.python.org/3.5/library/multiprocessing.html
选择用spawn或者forkserver的方式去新起进程,这种方式下,新起的进程并不会继承父进程一些不必要的资源,变量,锁等。
但是fork快呀,所以如果你能确定主进程中没有多进程,或者没有线程锁的情况下,使用fork
来源:oschina
链接:https://my.oschina.net/u/3534184/blog/4321170
python多进程卡死_Python 多进程中使用logging导致死锁相关推荐
- DllMain中不当操作导致死锁问题的分析——DllMain中要谨慎写代码(完结篇)
之前几篇文章主要介绍和分析了为什么会在DllMain做出一些不当操作导致死锁的原因.本文将总结以前文章的结论,并介绍些DllMain中还有哪些操作会导致死锁等问题.(转载请指明出于breaksoftw ...
- DllMain中不当操作导致死锁问题的分析--加载卸载DLL与DllMain死锁的关系
前几篇文章一直没有在源码级证明:DllMain在收到DLL_PROCESS_ATTACH和DLL_PROCESS_DETACH时会进入临界区.这个论证非常重要,因为它是使其他线程不能进入临界区从而导致 ...
- DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子2
本文介绍使用Windbg去验证<DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子>中的结论,调试对象是文中刚开始那个例子.(转载请指明出于breakso ...
- DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子
有了前面两节的基础,我们现在切入正题:研究下DllMain为什么会因为不当操作导致死锁的问题.首先我们看一段比较经典的"DllMain中死锁"代码.(转载请指明出于breaksof ...
- DllMain中不当操作导致死锁问题的分析--死锁介绍
最近在网上看到一些关于在DllMain中不当操作导致死锁的问题,也没找到比较确切的解答,这极大吸引了我研究这个问题的兴趣.我花了一点时间研究了下,正好也趁机研究了下进程对DllMain的调用规律.因为 ...
- python多进程原理_python多进程的详细介绍(附示例)
本篇文章给大家带来的内容是关于PHP中的SAPI是什么?如何实现?(图文),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 进程 Python是运行在解释器中的语言,查找资料知道,py ...
- python多进程打印输出_python 多进程日志 logging
python的logging模块提供了灵活的标准模块,使得任何Python程序都可以使用这个第三方模块来实现日志记录. 但是 python 中logging 并不支持多进程,所以会遇到不少麻烦. 以 ...
- python多进程卡死_python multiprocessing子进程hangs问题
0.前言 此文诞生源于python多进程的一个诡异表现,如果你使用pytho多进程过程中,发现子进程被挂起(一直处于Sleeping),请参考本文档. 本文先简单介绍python多进程常规用法,然后主 ...
- python多进程间通信_Python 多进程编程之 进程间的通信(Queue)
Python 多进程编程之 进程间的通信(Queue) 1,进程间通信 Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法 ----这是操作系统 ...
最新文章
- GCC 连接器、链接标准库 gcc -l、链接手动创建库(指定目录的库 gcc -L)
- 安卓使用Socket发送中文,C语言服务端接收乱码问题解决方式
- moco 搭建接口mock环境入门
- Linux_《Linux命令行与shell脚本编程大全》第二章学习总结
- 通过追源码解决:xmlrpc.client设定请求超时时间
- VTK:创建一棵树并标记顶点和边用法实战
- 跑monkey需要安装什么_坤秀为您解析无漆木门安装需要注意什么?
- Shiro 登录认证源码详解
- “不翻身,就要翻船”!帆软独家:制造业数字化转型解决方案
- Makefile之嵌套执行(9)
- java接口构造函数_Java8自定义函数式编程接口和便捷的引用类的构造器及方法
- centos的防火墙配置
- 【线段树】 SPOJ 2713 Can you answer these queries IV
- python程序控制结构与分支的实验报告_Python程序设计实验报告三:分支结构程序设计...
- POJ--3984--迷宫问题
- springMVC入门二
- python3 软件加密狗_给软件制作加密狗 - virbox加密空间站 - OSCHINA - 中文开源技术交流社区...
- Android FFmpeg视频播放器一解封装
- bp是什么意思贷款利率,利率上bp是什么意思
- matlab中对于xf(x)的积分,[matlab 积分]MATLAB求积分?
热门文章
- 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)——ubuntu环境设置默认是utf-8,文件编码可使用Encodersoft批量转换
- EXP 导出出错解决方案
- 【广告技术】如何提升定向广告效果?腾讯广告提出高质量负实例生成新方法
- 【专家有话说】如何用TI-ONE与Angel框架玩转腾讯广告算法大赛?
- oracle em界面监控出来的奇怪图像_监控工程常见的5大难题,项目中都会遇到
- python3安装包是说解压数据出错怎么办_无法修复“zipimport.zipimporter错误:无法解压缩数据;键入python3.6时zlib不可用获取pip.py...
- 强化学习 ---baselines项目之 Atari游戏的网络结构解析
- 机器学习-吴恩达-笔记-11-异常检测
- C语言中简单的题目,C语言的一些简单题目,没有答案,哪位大神帮忙做一下!!!...
- unity如何检测内存泄漏_如何排查Java内存泄漏?看懂这一篇就够用了