Skr-Eric的网络编程课堂(七)-- 多进程和进程间通信

multiprocessing 模块创建进程

 

1. 需要将要执行的事情封装为函数

2. 使用multiprocessing模块中Process类创建进程对象

3. 通过对象属性设置和Process的初始化函数对进程进行设置,绑定要执行的函数

4. 启动进程,会自动执行进程绑定的函数

5. 完成进程的回收

 

Process()

功能 : 创建进程对象

参数 : name  进程名称  Process-1

        target  绑定函数

args  元组  给target函数按照位置传参

        kwargs  字典  给target函数按照键值对传参

 

p.start()

功能:启动进程

* target函数会自动执行,此时进程真正被创建

 

p.join([timeout])

功能 : 阻塞等待回收子进程

参数 : 超时时间

 

* 使用multiprocessing创建子进程,同样子进程复制父进程的全部代码段,父子进程各自执行互不影响,父子进程有各自的运行空间

* 如果不使用join回收子进程则子进程退出后会成为僵尸进程

* 使用multiprocessing创建子进程往往父进程只是用来创建进程回收进程

 

注意

1. 如果子进程从父进程拷贝对象,对象和网络或者文件相关联,那么父子进程会使用同一套对象属性,相互有一定的关联性

2. 如果在子进程中单独创建对象,则和父进程完全没有关联

 

Process进程对象属性

 

p.start()

p.join()

p.is_alive()  

判断进程生命周期状态,处于生命周期得到True否则返回False

p.name 进程名称 默认为Process-1

p.pid  进程的PID号

p.daemon

默认状态False  主进程退出不会影响子进程执行

如果设置为True 则子进程会随着主进程结束而结束

 

* 要在start前设置

* 一般不和join一起使用

 

创建自定义进程类

 

1. 继承Process

2. 编写自己的__init__ ,同时加载父类init方法

3. 重写run方法,可以通过生成的对象调用start自动运行

 

多进程

 

优点 : 可以使用计算机多核,进行任务的并发执行,提高执行效率

        空间独立,数据安全

运行不受其他进程影响,创建方便

缺点 : 进程的创建和删除消耗的系统资源较多

 

进程池技术

 

产生原因 : 如果有大量任务需要多进程完成,则可能需要频繁的创建删除进程,给进算计带来较多的资源消耗。

原理 : 创建适当的进程放入进程池,用来处理待处理事件,处理完毕后进程不销毁,仍然在进程池中等待处理其他事件。 进程的复用降低了资源的消耗

 

使用方法

1. 创建进程池,在池内放入适当的进程

2. 将事件加入到进程池等待队列

3. 不断取进程执行事件,直到所有事件执行完毕

4. 关闭进程池,回收进程

 

from multipeocessing import  Pool

 

Pool(processes)

功能 : 创建进程池对象

参数 :表示进程池中有多少进程

 

pool.apply_async(func,args,kwds)

功能 : 将事件放入到进程池队列

参数 : func 事件函数

        args 以元组形式给func传参

kwds 以字典形式给func传参

返回值 : 返回一个代表进程池事件的对象

 

pool.apply(func,args,kwds)

功能 : 将事件放入到进程池队列

参数 : func 事件函数

        args 以元组形式给func传参

kwds 以字典形式给func传参

 

pool.close()

功能: 关闭进程池

 

pool.join()

功能:回收进程池

 

pool.map(func,iter)

功能: 将要做的时间放入进程池

参数: func  要执行的函数

       iter  迭代对象

返回值 : 返回事件函数的返回值列表

 

进程间通信 (IPC)

 

原因 : 进程空间相对独立,资源无法相互获取,此时在不同进程间通信需要专门方法。

进程间通信方法 : 管道   消息队列  共享内存  信号

                   信号量  套接字

 

管道通信  Pipe

 

通信原理 : 在内存中开辟管道空间,生成管道操作对象,多个进程使用"同一个"管道对象进行操作即可实现通信

multiprocessing ---》 Pipe

fd1,fd2 = Pipe(duplex = True)

功能 : 创建管道

参数 : 默认表示双向管道

        如果设置为False则为单向管道

返回值 : 表示管道的两端

          如果是双向管道 都可以读写

  如果是单向管道 则fd1只读 fd2只写

 

fd.recv()

功能 : 从管道读取信息

返回值: 读取到的内容

* 如果管道为空则阻塞

 

fd.send(data)

功能:向管道写入内容

参数: 要写入的内容

* 可以发送python数据类型

 

消息队列

 

队列 : 先进先出

通信原理 : 在内存中建立队列数据结构模型。多个进程都可以通过队列存入内容,取出内容的顺序和存入顺序保持一致

 

创建队列

q = Queue(maxsize = 0)

功能 : 创建消息队列

参数 : 表示最多存放多少消息。默认表示根据内存分配存          储

返回值 : 队列对象

 

q.put(data,[block,timeout])

功能: 向队列存储消息

参数 :data 要存的内容

       block 默认队列满时会阻塞,设置为False则非阻塞

       timeout 超时时间

 

data = q.get([block,timeout])

功能:获取队列消息

参数:block 默认队列空时会阻塞,设置为False则非阻塞

      timeout 超时时间

返回值 : 返回取出的内容

 

q.full()   判断队列是否为满

q.empty()  判断队列是否为空

q.qsize()  判断队列中消息数量

q.close()  关闭队列

 

共享内存

 

通信原理:在内存空开辟一块空间,对多个进程可见,进程可以写入输入,但是每次写入的内容会覆盖之前的内容。

 

obj = Value(ctype,obj)

功能 : 开辟共享内存空间

参数 : ctype  要存储的数据类型

        obj  共享内存的初始化数据

返回 :共享内存对象

obj.value 即为共享内存值,对其修改即修改共享内存

 

obj = Array(ctype,obj)

功能 : 开辟共享内存空间

参数 : ctype  要存储的数据格式

        obj  初始化存入的内容 比如列表,字符串

     如果是整数则表示开辟空间的个数

返回值 : 返回共享内存对象

         * 可以通过遍历过户每个元素的值

   e.g.  [1,2,3]  ---> obj[1] == 2

         * 如果存入的是字符串

   obj.value 表示字符串的首地址

 

                 管道         消息队列       共享内存

开辟空间   内存             内存              内存

读写方式   两端读写     先进先出       覆盖之前内容

                  双向/单向

效率            一般              一般               较高

应用       多用于父        广泛灵活        需要注意

                 子进程                             进行互斥操作

 

 

 

 

 

想要看更多的课程请微信关注SkrEric的编程课堂

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值