进程通信(IPC) 进程池

 

Process(target,name,args,kwargs)

 

name:给进程起名字

     默认为Process-1 Process-2

     p.name 可以获取进程的名称

args:以元祖的形式给target函数传参

kwargs:

进程对象的其他属性

p.name

p.start()

p.join()

p.pid(): 创建的新的进程的pid号

p.is_alive()  判断进程是否处于alive状态(活着返回true,否则返回false)

p.daemon   默认为false  如果设置为true 则主进程退出时子进程也会结束

设置注意事项: 属性设置要在start()前设置

设置daemon为true 则一般不需要加join

守护进程:和终端分离,不受中断控制

        后台运行

        生命周期长

获取文件大小

size = os.path.getsize('./timg.jpeg')

注意:如果多个子进程进行拷贝同一个父进程中的对象,则多个子进程使用的是同一个对象(如文件对象,套接字,队列,管道)

如果是在创建进程后单独创建的对象,则多个子进程各不相同

 

创建自定义进程类

1.编写类继承Process

2.在自定义类中加载父类__init__以获取父类属性,同时可以自定义新的属性

3.重写run方法,在调用start时自动执行该方法  一定是run这个特有名称

 

 

进程的缺点

进程在创建和销毁的过程中消耗的资源相对较多 (小程序不断创建和销毁,浪费资源)

 

 

进程池技术

产生原因:如果有大量的任务需要多进程完成,二任务周期又比较短且需要频繁的创建 此时可能产生大量频繁创建销毁的情况,消耗计算机资源较大

 

 

使用方法:

1.创建进程池,在池内放入适当数量的进程(根据计算机的核 2 = 2 稍大点也可以3 = 2)

2.将事件封装函数,放入到进程池

3.时间不断运行,直到所有放入进程池时间运行完成

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

 

 

from multiprocessing import Pool

Pool(processes)

功能:创建进程池对象

参数:进程数量

返回:进程池对象

 

pool.apply_async(fun,args,kwds) (不是阻塞函数)

功能:将事件放入进程池执行

参数: fun 要执行的事件函数

     args 以元组为fun传参

     kwds 以字典为fun传参

返回值:返回一个事件对象  通过get()属性函数可以获取fun的返回值

pool.close()

功能:关闭进程池,无法再加入新的事件,但是里面的还在执行的也会运行

pool.join()

功能:回收进程池

异步:可以操作多个   同步:必须一个一个的完成

 

poll.map(fun,iter)

 

 

poll.map(func,iter)

功能:将要执行的事件放入到进程池

参数:func 要执行的函数

    iter 迭代对象,给func传参

返回值:返回func的返回值列表

 

 

进程间通信(ipc)

由于进程间空间独立,资源无法共享,此时在进程间通信就需要专门的通信方法

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

 

管道通信(必须要有同一个的管道对象)

在内存中开辟一块空间,形成管道结构,多个进程使用同一个管道,即可对管道的读写操作(io)进行通信

 

multiprocessing    pipe

fd1,fd2 = Pipe(duplex = True)

功能:创建管道

参数:默认表示双向管道(两边都能发和收)

    如果设置为False则为单向管道(一端发一端收)   

返回值:两个管道对象,分别表示管道的两端

      如果是双向管道则均可读写

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

 

fd.recv()

功能:从管道读取信息

返回值:读取到的内容

**当管道为空,则阻塞

 

fd.send(data)

功能:向管道写入内容

参数:要写入的内容

**管道满时会阻塞

  可以写入几乎所有的pyhon数据

 

消息队列

队列:先进先出

现存入队列的消息会被先获取到

在内存中开辟队列空间,对多个进程可见 多个进程操作同一个队列对象可以实现消息的存取工作

 

创建队列

q = Quequ(maxsize = 0)

功能:创建队列对象

参数:maxsize 默认表示系统自动分配队列空间

    如果传入正整数则表示最多存放多少条消息

返回值:队列对象

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

功能:向队列中存入消息

参数:data 存入的消息  (支持python数据类型)

    默认为true 表示当队列满时阻塞

    设置为false 则为非阻塞

    timeout 超时时间

q.get([block,timeout])

功能:获取队列消息

参数:block 默认为true 表示队列空时阻塞

          设置为false则表示为非阻塞

返回值:返回获取到的消息

 

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

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

q.qsize()  获取队列中消息数量

q.close()  关闭队列

 

 

共享内存

在内存中开辟一端空间,存储数据,对这个进程可见,每次写入共享内存的内容都会覆盖之前的内容,对内存的读取操作也不会改变内存中的内容

 

from multiprocessing Value Array

shm = Value(ctype,obj)

功能:开辟共享内存空间

参数:ctype  数据的类型要转变的C的类型

    obj    共享内存的初始数据

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

shm.value  表示共享内存中的值 

 

 

shm = Array(ctype,obj)

功能:开辟共享内存空间

参数:ctype  数据的类型要转变的C语言的类型

    obj    要存入共享内存的数据

           列表.字符串 表示要存入的内容为列表哈或字符串,要求列表里面的类型相    同

           整数  表示要开辟几个单元的空间 (6)  

返回值:返回共享内存对象  可迭代对象

 

           管道     消息队列     共享内存

开辟空间    内存      内存         内存       第三方(磁盘 数据库)

读写方式    两端读写  先进先出     每次覆盖上次内容

           双向/单向

效率        一般      一般        较快

应用    多用于父子进程  应用灵活广泛 复杂,需要同步互斥操作

 

 

作业:1.熟练进程间通信和进程池的使用

    2.复习类的使用

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值