multiprocessing模块主要内容:
1、守护进程
2、进程同步
1.同步锁(*****)
2.信号量
3.事件
3、进程通信
1.队列(*****)
2.生产者消费者模型,JoinableQueue, 主要在队列的基础上多了两个功能:q.task_done,q.join
一、multiprocessing模块的介绍
仔细说来,multiprocess不是一个模块而是python中一个操作、管理进程的包。
之所以叫multi是取自multiple的多功能的意思,在这个包中几乎包含了和进程有关的所有子模块。
由于提供的子模块非常多,为了方便大家归类记忆,
我将这部分大致分为四个部分:
创建进程部分,
进程同步部分,
进程池部分,
进程之间数据共享。
重点强调:进程没有任何共享状态,进程修改的数据,改动仅限于该进程内,但是通过一些特殊的方法,可以实现进程之间数据的共享
1、process模块介绍
process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。
Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动)
强调:
1. 需要使用关键字的方式来指定参数
2. args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号
fe:创建一个进程
fe:证明子进程和主进程的关系
我们通过主进程创建的子进程是异步执行的,那么我们就验证一下,并且看一下子进程和主进程(也就是父进程)的ID号(讲一下pid和ppid,使用pycharm举例),来看看是否是父子关系。
子进程与主进程的关系
1.看一个问题,说明linux和windows两个不同的操作系统创建进程的不同机制导致的不同结果:
2.Process类中参数的介绍:
参数介绍:
1 group参数未使用,值始终为None
2 target表示调用对象,即子进程要执行的任务
3 args表示调用对象的位置参数元组,args=(1,2,'egon',)
4 kwargs表示调用对象的字典,kwargs={'name':'egon','age':18}
5 name为子进程的名称
fe:给要执行的函数传参数
给要执行的函数传参数
3.Process类中各方法的介绍:
join方法的例子:
让主进程加上join的地方等待(也就是阻塞住),等待子进程执行完之后,再继续往下执行我的主进程,
好多时候,我们主进程需要子进程的执行结果,所以必须要等待。join感觉就像是将子进程和主进程拼接起来一样,将异步改为同步执行。
join方法的例子
4.怎么样开启多个进程呢?for循环。
并且我有个需求就是说,所有的子进程异步执行,然后所有的子进程全部执行完之后,我再执行主进程,怎么搞?看代码
开启多个进程
fe:模拟两个应用场景:1、同时对一个文件进行写操作 2、同时创建多个文件
示例
5.Process类中自带封装的各属性的介绍
2、Process类的使用
注意:在windows中Process()必须放到# if name == ‘main‘:下
原因解释
练习:那我们自己通过多进程来实现一下同时和多个客户端进行连接通信。
我们之前学socket的时候,知道tcp协议的socket是不能同时和多个客户端进行连接的,(这里先不考虑socketserver那个模块),
对不对,那我们自己通过多进程来实现一下同时和多个客户端进行连接通信。
服务端代码示例:(注意一点:通过这个是不能做qq聊天的,
因为qq聊天是qq的客户端把信息发给另外一个qq的客户端,中间有一个服务端帮你转发消息,
而不是我们这样的单纯的客户端和服务端对话,并且子进程开启之后咱们是没法操作的,
并且没有为子进程input输入提供控制台,所有你再在子进程中写上了input会报错,EOFError错误,
这个错误的意思就是你的input需要输入,但是你输入不了,就会报这个错误。
而子进程的输出打印之类的,是pycharm做了优化,将所有子进程中的输出结果帮你打印出来了,但实质还是不同进程的。)
服务端代码客户端代码
1.上面我们通过多进程实现了并发,但是有个问题
每来一个客户端,都在服务端开启一个进程,如果并发来一个万个客户端,要开启一万个进程吗,你自己尝试着在你自己的机器上开启一万个,10万个进程试一试。
解决方法:进程池,本篇博客后面会讲到,大家继续学习呀
2.僵尸进程与孤儿进程(简单了解 一下就可以啦)
僵尸进程与孤儿进程
3、守护进程
4.进程同步(锁)重点
保证数据安全用的,但是将锁起来的那段代码的执行变成了同步串行,牺牲了效率,保证了安全
fe:接下来,我们以模拟抢票为例,来看看数据安全的重要性。
并发运行,效率高,但是竞争同一个文件,导致数据混乱加锁:购票行为由并发变成了串行,牺牲了效率,但是保证了数据安全
进程锁总结
进程锁总结
5、信号量 (了解)
信号量的使用
6、事件(了解)
事件介绍
事件方法的使用通过事件来模拟红绿灯示例基于事件的进程通信
7、队列(推荐使用)重点
队列:进程安全的,能够保证数据安全,
进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的。
队列就像一个特殊的列表,但是可以设置固定长度,并且从前面插入数据,从后面取出数据,先进先出。
Queue([maxsize]) 创建共享的进程队列。
参数 :maxsize是队列中允许的最大项数。如果省略此参数,则无大小限制。
底层队列使用管道和锁实现
队列的简单用法示例queue的方法介绍queue的其他方法(了解)子进程与父进程通过队列进行通信
8、生产者消费者的模型 JoinableQueue
缓冲区解耦的事情
Joinablequeue,能记录着你往队列里面put的数据量
其他方法和queue是一样的,比queue多了两个方法:q.task_done,q.join
队列是进程安全的:同一时间只能一个进程拿到队列中的一个数据,你拿到了一个数据,这个数据别人就拿不到了。
那么我们基于队列来实现一个生产者消费者模型,代码示例:
基于队列的生产者消费者模型