结论:python多进程间用Queue通信时,如果子进程操作Queue满了或者内容比较大的情况下,该子进程会阻塞等待取走Queue内容(如果Queue数据量比较少,不会等待),如果调用join,主进程将处于等待,等待子进程结束,造成死锁

解决方式:在调用join前,及时把Queue的数据取出,而且Queue.get需要在join前

原理分析

模拟子进程阻塞:

from multiprocessing import Process, Queue

def fun(q):

num = 1000000000

q.put('=' * num)

print("done put")

if __name__ == '__main__':

queue = Queue()

p = Process(target=fun, args=(queue,))

p.start()

p.join()

print("done")

原因分析:

#

# Queue type using a pipe, buffer and thread

#

class Queue(object):

multiprocessing.Queue底层是基于Pipe构建,操作系统管道不是无限长,因此子进程在执行put()期间,处于阻塞,直到某些其他进程使用get()从队列中取走数据。上例中,主进程等待子进程,打印不了done

而当队列put数据比较少时,是没有问题的,先打印done put,再打印done,但这样写法是有隐患,当put数据比较多时,就会阻塞

from multiprocessing import Process, Queue

def fun(q):

num = 1

q.put('=' * num)

print("done put")

if __name__ == '__main__':

queue = Queue()

p = Process(target=fun, args=(queue,))

p.start()

p.join()

print("done")

正确的写法

from multiprocessing import Process, Queue

def fun(q):

num = 1000000000

q.put('=' * num)

print("done put")

if __name__ == '__main__':

queue = Queue()

p = Process(target=fun, args=(queue,))

p.start()

queue.get()

p.join()

print("done")

在join前面调用queue.get

注意!!!以下这样写法也是不对的,join要在queue.get前面,不然主进程等待子进程结束,而子进程等待队列数据取走,造成死锁

p = Process(target=fun, args=(queue,))

p.start()

p.join()

queue.get()

Python多线程补充

Python 是一门解释型语言,它的执行是由解释器来控制的。

GIL,全称是 Global Interpreter Lock ,全局解释锁 ,专门给解释器用

一般情况下在用户态下是无法做到线程级别的时间片轮转

但是 python 能做到!python 里,解释器可以记录每一个线程执行了多长时间——时间一到,就能够切换到另一条线程。

GIL 就是拿来给线程加锁的,当一个线程将要执行时,解释器会把 GIL 锁给这个线程,其他线程因为没有锁,是无法运行的。等到持有锁线程阻塞或者运行 100 个字节码,解释器就会把锁交给其他线程。

但是这个 GIL 锁是全局(Global)的,也就导致即使是多核情况下,一次也只有一个线程能运行,从整体上看,整个程序是串行的。

python多线程应用

拿爬虫程序来说吧,单个爬虫总会花时间在下载网页上,很多 CPU 时间就浪费掉了,提供 sleep 机制后,这些爬虫可以在等待下载时释放 GIL 锁,把机会让给其他爬虫,这样整体运行速度能够得到大幅提升

也就是说 Python 的多线程适合 I/O 密集型的程序,但是对计算密集型程序就不那么友好了

对于计算密集型程序用多进程或者让 python 调用 C 语言的代码,在 C 语言里实现多线程

python多进程运行死机_python多进程假死相关推荐

  1. android studio 假死机,解决Android-studio假死机建议

    背景 终于第一个ios app发布应用商店送审了,这下也有时间把以前写的android更新一版,但是很久没遇到的as假死机问题又各种折腾了一天..最终解决的方法实在是让人忍无可忍,实在是想写下来给那些 ...

  2. win7下计算机假死,win7系统电脑假死机怎么办

    我们在使用电脑的过程中,经常会遇到运行某个程序时,计算机无法及时响应,导致操作系统假死的情况. 电脑假死的现象是令人最厌烦的一种情况,当我们操作电脑的速度稍微快一点或者是多打开几个网页,运行了某个比较 ...

  3. 三星电视显示服务器无响应,三星液晶电视死机怎么办 三星液晶电视死机解决方法...

    用智能电视看视频.玩游戏已经是现在生活中常见的场景了.我们经常会下载各种好玩的游戏和好看的视频,可能时不时会有一些闪退卡顿的小问题,偶尔还会遇到电视死机,智能电视死机了怎么办?马上回复出厂设置?马上去 ...

  4. 计算机黑屏死机,电脑黑屏死机怎么解决(一键修复电脑黑屏死机的方式)

    世界上有很多东西都会随着时间发生改变,但是Windows的BUG却不会. 对于微软来说,Windows系统在更新的同时又带来一堆BUG,已经是一项传统艺能. 放眼全球,大部分用户都曾遭到过Window ...

  5. python多进程用不了_Python多进程相关的坑

    Python的multiprocessing模块实现了多进程功能,但官方文档上只有一些比较简单的用法,主要是使用函数作为process的target,而如何在class中使用多进程并没有多讲解.goo ...

  6. python多线程多进程多协程_python 多进程、多线程、协程

    1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有 ...

  7. python3多进程写时拷贝_python多进程实现复制文件

    [Python] 纯文本查看 复制代码''' 多进程实现复制文件 步骤: (1)获得源文件夹路径: (2)获取源文件夹下各文件的文件名 (3)获得目标文件夹 (4)复制文件(文件夹不能复制) 新增内容 ...

  8. python为什么运行不了_python怎么运行py文件

    小编致力于为大家奉献最有效的经验,让大家能够解决掉问题,但是大家也都知道,每个人遇到的情况都是不一样的,大家在看小编经验的同时,除了跟随操作,也需要自己的思考,举一反三的解决问题,这样才会变得更加有内 ...

  9. python 定时运行 定时关闭_Python脚本用于定时关闭网易云音乐PC客户端

    本文主要讲述如何使用Python在指定的秒数后关闭Windows上运行的程序(此程序以网易云音乐为例).本文的背景是昨晚发现网易云音乐的PC客户端没有定时关闭的功能,可以使用Python编写一个简单的 ...

最新文章

  1. 界面怎么使用pip_从零开始学Python——10Pyinstaller的使用
  2. mac微软雅黑字体_【字体字重】常见设计稿字体对应字重
  3. 浏览器扩展系列————透明浏览器窗口的实现
  4. haproxy透传用户ip-方法和原理
  5. js如何监听元素事件是否被移除_JavaScript 监听元素是否进入/移出可视区域
  6. KVM虚拟机搭建增量镜像(一个基本镜像拷贝成无数多个子镜像)
  7. DPDK PMD( Poll Mode Driver)轮询模式驱动程序
  8. java Excel导出 xlsx格式(超简单)
  9. 学生成绩管理系统V3.0链表版
  10. Android开发点滴 - 实现层级式导航(API 16+)
  11. Windows 10 系统 Java 最新 最全 JDK下载 安装和环境配置 及 卸载:
  12. BZOJ5185: [Usaco2018 Jan]Lifeguards
  13. Android 热点发多播,腾讯体育-中超英超直播(com.tencent.qqsports) - 6.5.21.960 - 应用 - 酷安...
  14. We Dont Kown ....
  15. 【机器学习】逻辑回归(LogisticRegression)原理与实战
  16. 团购的玩法 要粘性也要乐趣
  17. 打印系统开发(36)——打印方面套打是什么意思,如何实现套打?
  18. 生成微信小程序码、URL Scheme和URL Link
  19. 华为HCIP-DATACOM题库解析271-300(821)
  20. 几何学小课堂:解析几何(用代数的方法解决更难的几何题)【笛卡尔几何】

热门文章

  1. java代码继承------多层继承
  2. 【转】凡是能拉进与妹子距离的产品都是好产品
  3. 【解决】打印机只打印第一页纸的问题
  4. screen中文乱码问题的解决
  5. java业务类_Java_业务层开发
  6. javascript监听输入框_html通过JS/jQuery实现 实时监听输入框input的内容
  7. b区计算机科学与技术调剂院校,B区调剂院校梳理!希望你用不到,但一定要收藏!...
  8. android if else,Android对很多if和else条件
  9. 关于Qt5.10调试时出现“qtcreatorcdbext.dll cannot be found.”的解决方案
  10. Netkiller 手札 2019 CHM 格式电子书下载