mutilprocess模块的用法
mutilprocess用法
导入Process类
使用Process类生成对象
调用对象的方法
start()
开启子进程
join()
等待这个子进程结束再执行下面的代码
pid与ppid
查看pid
- 导入current_process
- current_process().pid
- 查看子进程的pid属性
- p.pid
- 导入os
- os.get_pid()
查看ppid
- 导入os
- os.get_ppid()
os的方法在任意进程都可以查看当前进程和父进程pid
守护进程
process(daemon= true)
当父进程的最后一行代码结束时,守护进程不管执行到什么地方都会结束
PS:是父进程的代码最后一行,而不是父进程的程序运行完的时候
terminate()
向操作系统发送中断程序的指令
is_alived
返回值是bool类型
判断进程是否还在运行
name
查看进程的名字
一般是Process-1[-2,]之类的,无意义
JoinableQueue
与Queue的不同之处就在多了一个join方法
认识join方法
- 每拿出一个数据时调用一次task_done()方法
- 如果当前队列中还有数据时
- join就会阻塞在这里,直到队列里的数据被清空,程序才会继续执行
生产者消费者模型
from multiprocessing import Queue,Process
def producer(q,food,name):
for i in range(10):
res = f"{name}生产{food},编号:{i}"
q.put(res)
print(res)
q.put('')
def consumer(q,name):
while True:
res = q.get()
if not res :break
print(f"{name}吃了{res}")
if __name__ == '__main__':
q = Queue(5)
p1 = Process(target=producer,args=(q,'cake','mark'))
p2 = Process(target=producer,args=(q,'mike','nick'))
c1 = Process(target=consumer,args=(q,'jiangheng'))
c2 = Process(target=consumer,args=(q,'yanzhibing'))
c3 = Process(target=consumer,args=(q,'yanzhibing'))
p1.start()
p2.start()
c1.start()
c2.start()
q.put(None)
c3.start()
生产者
- 生产数据
缓冲区
- 生产者将数据放入缓冲区,
消费者将数据从缓冲区取出
消费者
- 处理数据
优点
- 解耦
- 支持并发
- 支持忙闲不均
- 生产者消费者模型,大大提高了生产者的生产效率,也大大提高了消费者的消费效率.
队列
管道+锁
- 管道:底层基于内存共享
- 锁:进程锁
q=Queue(n)
- 生成队列对象,设置队列大小
q.put()
- 将任意数据类型放入
q.get()
- 将队列中的第一个数据取出
put/get的默认参数
- block
- 默认为true
- 当队列满了,再put就会进入等待状态
- 当队列空了,再get就会进入等待状态
- 当为False时
- 当队列满了,再put就会抛错
- 当队列空了,再get就会抛错
- 默认为true
- timeout
- 只有当block为True时,才有意义
- 设置等待状态所持续的时间,
超出时间一样会报错
进程锁
from multiprocessing import Lock
- 导入Lock
lock = Lock()
- 定义锁对象
lock.acquire()
- 为你的某一部分代码上锁
- 注意的是,当这把锁上锁时,其他进程无法运行这部分的代码
lock.release()
- 解锁
- 只有解锁后,其他进程才可以抢到这把锁来继续运行自己的代码
注意:在多进程是要确保多个进程使用的是同一把锁
XMind: ZEN - Trial Version