这个问题算是个很老问题了,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导致死锁相关推荐

  1. DllMain中不当操作导致死锁问题的分析——DllMain中要谨慎写代码(完结篇)

    之前几篇文章主要介绍和分析了为什么会在DllMain做出一些不当操作导致死锁的原因.本文将总结以前文章的结论,并介绍些DllMain中还有哪些操作会导致死锁等问题.(转载请指明出于breaksoftw ...

  2. DllMain中不当操作导致死锁问题的分析--加载卸载DLL与DllMain死锁的关系

    前几篇文章一直没有在源码级证明:DllMain在收到DLL_PROCESS_ATTACH和DLL_PROCESS_DETACH时会进入临界区.这个论证非常重要,因为它是使其他线程不能进入临界区从而导致 ...

  3. DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子2

    本文介绍使用Windbg去验证<DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子>中的结论,调试对象是文中刚开始那个例子.(转载请指明出于breakso ...

  4. DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子

    有了前面两节的基础,我们现在切入正题:研究下DllMain为什么会因为不当操作导致死锁的问题.首先我们看一段比较经典的"DllMain中死锁"代码.(转载请指明出于breaksof ...

  5. DllMain中不当操作导致死锁问题的分析--死锁介绍

    最近在网上看到一些关于在DllMain中不当操作导致死锁的问题,也没找到比较确切的解答,这极大吸引了我研究这个问题的兴趣.我花了一点时间研究了下,正好也趁机研究了下进程对DllMain的调用规律.因为 ...

  6. python多进程原理_python多进程的详细介绍(附示例)

    本篇文章给大家带来的内容是关于PHP中的SAPI是什么?如何实现?(图文),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 进程 Python是运行在解释器中的语言,查找资料知道,py ...

  7. python多进程打印输出_python 多进程日志 logging

    python的logging模块提供了灵活的标准模块,使得任何Python程序都可以使用这个第三方模块来实现日志记录. 但是 python 中logging 并不支持多进程,所以会遇到不少麻烦. 以 ...

  8. python多进程卡死_python multiprocessing子进程hangs问题

    0.前言 此文诞生源于python多进程的一个诡异表现,如果你使用pytho多进程过程中,发现子进程被挂起(一直处于Sleeping),请参考本文档. 本文先简单介绍python多进程常规用法,然后主 ...

  9. python多进程间通信_Python 多进程编程之 进程间的通信(Queue)

    Python 多进程编程之 进程间的通信(Queue) 1,进程间通信 Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法 ----这是操作系统 ...

最新文章

  1. GCC 连接器、链接标准库 gcc -l、链接手动创建库(指定目录的库 gcc -L)
  2. 安卓使用Socket发送中文,C语言服务端接收乱码问题解决方式
  3. moco 搭建接口mock环境入门
  4. Linux_《Linux命令行与shell脚本编程大全》第二章学习总结
  5. 通过追源码解决:xmlrpc.client设定请求超时时间
  6. VTK:创建一棵树并标记顶点和边用法实战
  7. 跑monkey需要安装什么_坤秀为您解析无漆木门安装需要注意什么?
  8. Shiro 登录认证源码详解
  9. “不翻身,就要翻船”!帆软独家:制造业数字化转型解决方案
  10. Makefile之嵌套执行(9)
  11. java接口构造函数_Java8自定义函数式编程接口和便捷的引用类的构造器及方法
  12. centos的防火墙配置
  13. 【线段树】 SPOJ 2713 Can you answer these queries IV
  14. python程序控制结构与分支的实验报告_Python程序设计实验报告三:分支结构程序设计...
  15. POJ--3984--迷宫问题
  16. springMVC入门二
  17. python3 软件加密狗_给软件制作加密狗 - virbox加密空间站 - OSCHINA - 中文开源技术交流社区...
  18. Android FFmpeg视频播放器一解封装
  19. bp是什么意思贷款利率,利率上bp是什么意思
  20. matlab中对于xf(x)的积分,[matlab 积分]MATLAB求积分?

热门文章

  1. 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)——ubuntu环境设置默认是utf-8,文件编码可使用Encodersoft批量转换
  2. EXP 导出出错解决方案
  3. 【广告技术】如何提升定向广告效果?腾讯广告提出高质量负实例生成新方法
  4. 【专家有话说】如何用TI-ONE与Angel框架玩转腾讯广告算法大赛?
  5. oracle em界面监控出来的奇怪图像_监控工程常见的5大难题,项目中都会遇到
  6. python3安装包是说解压数据出错怎么办_无法修复“zipimport.zipimporter错误:无法解压缩数据;键入python3.6时zlib不可用获取pip.py...
  7. 强化学习 ---baselines项目之 Atari游戏的网络结构解析
  8. 机器学习-吴恩达-笔记-11-异常检测
  9. C语言中简单的题目,C语言的一些简单题目,没有答案,哪位大神帮忙做一下!!!...
  10. unity如何检测内存泄漏_如何排查Java内存泄漏?看懂这一篇就够用了