这段时间沉迷MultiProcessing模块不能自拔,没办法,python的基础不太熟,因此就是在不断地遇到问题解决问题。之前学习asyncio模块学的一知半解,后来想起MultiProcessing模块更是一知半解,趁着暑假无聊就研究了一下,不得不说,这加深了自己对Python基础的掌握与理解...于是就有了这一系列《python标准库之MultiProcessing库的研究 (1)》《python MultiProcessing标准库使用Queue通信的注意要点》《python标准库之MultiProcessing库的研究 (2)》,今天算是最后做个总结吧,以及解惑,随后你就知道解啥惑了。

我没有详细的讲解MultiProcessing这个包的源代码,没有讲解Pool底层机制,只有一个原因,我火候不够,若是现在强行理解,对我没多大好处,所以我选择顺其自然,先把最基本的用法掌握,实在不懂得看看源码,大概过一遍源码,对其实现机制有个大概的了解。MultiProcessing源代码包我大概就认真看了两个Pool.py以及managers.py,MultiProcessing的queues.py大概看了一下,最后总结的就是:不要觉得那些什么包,框架,模块高大上,多方便,其实认真阅读源码你就会发现,那其实就是某个基础扎实亦或是一群基础扎实的大牛写就得。换句话说,那些高大上的框架就是基础的东西组成的。有人说,你说的这么轻松,你写个试试。对不起,我写不了,我说这些不是我装逼怎么样,只是阐述事实,而且并没有贬低那些框架的意思,只是想降低你对这些框架的"敬畏"之心,不过话说回来,我觉着自己也能写就框架,只是现在还不是时候,基础不扎实。一个框架的写成,需要作者知识的深度与广度!可惜,我资历不够,慢慢来吧,我相信自己也会有那么一天...

总结的差不多了,具体的代码你可以看看上面提到的几篇文章

下面就是解惑了:为什么使用MultiProcessing的Process创建的进程就能够时候用MultiProcessing的Queue来实现进程间通信,而使用Pool进程池创建的进程却不行?而且为什么要使用MultiProcessing的Queue而不使用标准库的Queue。

我在之前的一篇文章说过,标准库的Queue只能实现线程间的通信,其get,put方法是阻塞的,而且除了这两个方法之外的其他方法是不安全的,不能保证在多线程通信时,能够稳定的访问变量,对变量进行处理...

Queue.Queue是进程内非阻塞队列,multiprocess.Queue是跨进程通信队列。多进程前者是各自私有,后者是各子进程共有。
from Queue import Queue这个是普通的队列模式,类似于普通列表,先进先出模式,get方法会阻塞请求,直到有数据get出来为止
from multiprocessing.Queue import Queue这个是多进程并发的Queue队列,用于解决多进程间的通信问题。普通Queue实现不了。例如来跑多进程对一批IP列表进行运算,运算后的结果都存到Queue队列里面,这个就必须使用multiprocessing提供的Queue来实现

线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。线程可与属于同一进程的其他线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,当然,拥有其在运行中必不可少的资源...进程间能不共享资源就不要共享...

so,解释的差不多了吧...

下面看看 官网 的对Manager的介绍:
Managers provide a way to create data which can be shared between different processes, including sharing over a network between processes running on different machines. A manager object controls a server process which manages shared objects. Other processes can access the shared objects by using proxies.

我看了下Manager的源代码,它使用了代理以及socket中的recv()等方法(好像是socket里面的)来实现跨进程通信以及代理通信

在这里要理清一个思绪:
MultiProcessing.Process创建的进程是有共同父进程的,而MultiProcess.Pool创建的进程则不是。进程池的存在就是为了减少进程的创建与销毁的开销。在这里我有个疑问了:创建一个子进程与创建一个进程有何区别?其开销应该不一样吧。
python实现多进程间通信的方式有很多种,例如队列,管道等.
但是这些方式只适用于多个进程都是源于同一个父进程的情况
如果多个进程不是源于同一个父进程,只能用共享内存,信号量等方式,但是这些方式对于复杂的数据结构,例如Queue,dict,list等,使用起来比较麻烦,不够灵活。
Manager是一种较为高级的多进程通信方式,它支持Python支持的任何数据结构....

因此,我们能够使用MultiProcessing的Queue通信,但是如果使用的是进程池创建的进程,那么就得使用Manager类封装的数据结构了...

python MultiProcessing模块进程间通信的解惑与回顾的更多相关文章

  1. python multiprocessing模块

    python multiprocessing模块 原文地址 multiprocessing multiprocessing支持子进程.通信和共享数据.执行不同形式的同步,提供了Process.Queu ...

  2. python multiprocessing模块 介绍

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu\_count\(\)查看),在python中大部分情况需要使用多进 ...

  3. Python multiprocessing模块的Pool类来代表进程池对象

    #-*-coding:utf-8-*- '''multiprocessing模块提供了一个Pool类来代表进程池对象 1.Pool可以提供指定数量的进程供用户调用,默认大小是CPU的核心数: 2.当有 ...

  4. Python标准模块--multiprocessing

    1 模块简介 multiprocessing模块在Python2.6中引入.最初的multiprocessing是由Jesse Noller和Richard Oudkerk在PEP 371中定义.就像 ...

  5. python多进程multiprocessing模块中Queue的妙用

    最近的部门RPA项目中,小爬为了提升爬虫性能,使用了Python中的多进程(multiprocessing)技术,里面需要用到进程锁Lock,用到进程池Pool,同时利用map方法一次构造多个proc ...

  6. Python之进程 2 - multiprocessing模块

    ​ 我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序也是一个进程,那么我们也可以在程序中再创建进程.多个进程可以实现并发效果,也就是说, ...

  7. python之多进程multiprocessing模块

    process类介绍 multiprocessing 模块官方说明文档 Process 类用来描述一个进程对象.创建子进程的时候,只需要传入一个执行函数和函数的参数即可完成 Process 示例的创建 ...

  8. python 3 并发编程之多进程 multiprocessing模块

    一 .multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程. ...

  9. Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块

    Python第十五天  datetime模块 time模块   thread模块  threading模块  Queue队列模块  multiprocessing模块  paramiko模块  fab ...

随机推荐

  1. 高通平台MSM8916LCM模块移植(一)-bootloader部分

    此次移植打算分成两个模块来说,bootloader部分和kernel部分.在实际的移植调试过程中也是这么分成了两个部分分别调试. 高通平台中的bootloader叫做LK(Little Kernel, ...

  2. 银联在线 网关支付 (JAVA版)

    这一版本的编写是在我上一次博客的基础上写的,有不懂得童鞋可以先看下我的原先在线支付的博客,熟悉下:http://blog.csdn.net/yulei_qq/article/details/45197 ...

  3. (六十七)Xcode导入XMPPFramework框架

    首先下载XMPPFramework框架,将Vendor内容导入到工程中,其中KissXML需要额外的框架,需要通过Xcode设置. 选择工程选项中TARGETS的General标签,最下侧有Linke ...

  4. JUI/DWZ 分页 Servlet

    分页介绍 参考:官方用户手册中的"分页组件"         分页思路服务器返回当前页的数据,总条数,再由js来生成分页标签.分页是配合服务器端来处理的, 不是存js做的分页. 因 ...

  5. MacTalk·人生元编程 - 读书笔记

    简介 <MacTalk·人生元编程>是一本随笔文集,主要内容来自作者的微信公众平台"MacTalk By 池建强".本书撰写于2013年,书中时间线却不止于此.作者以一 ...

  6. 扩展GDAL,支持CNSDTF格式(一)

    扩展GDAL,支持CNSDTF格式(一) 一.        简介 本文主要根据<中华人民共和国国家标准GB/T17798-2007--地理空间数据交换格式(Geospatialdata tra ...

  7. 分布式进阶(十一) Docker 常见错误汇总

    NO.1 以上添加网桥的命令在Ubuntu14.04中是不可行的.正确的命令如下: brctl addbr br0 ifconfig br0 192.168.1.188 netmask 255.255 ...

  8. listview优化(中)

    1,对Imageview使用setTag()方法来解决图片错位问题,这个Tag中设置的是图片的url,然后在加载的时候取得这个url和要加载那position中的url对比,如果不相同就加载,相同就是 ...

  9. Java 对象在堆中的内存结构

    翻译人员: 铁锚 翻译日期: 2013年11月8日 原文链接:  What do Java objects look like in memory during run-time? 我们知道,函数每次 ...

  10. 环境连接报错(最大连接数超过) APP-FND-01516

    数据库用户登录服务器,sqlplu 解决办法: 先把界面上要保存的操作保存好 应用用户登录,切换到ora用户 杀掉进程 ps -fu ora | grep LOCAL=NO|grep -v grep| ...