mutilprocess模块的用法

Posted marklijian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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就会抛错
  • timeout
    • 只有当block为True时,才有意义
    • 设置等待状态所持续的时间,
      超出时间一样会报错

进程锁

from multiprocessing import Lock

  • 导入Lock

lock = Lock()

  • 定义锁对象

lock.acquire()

  • 为你的某一部分代码上锁
  • 注意的是,当这把锁上锁时,其他进程无法运行这部分的代码

lock.release()

  • 解锁
  • 只有解锁后,其他进程才可以抢到这把锁来继续运行自己的代码

注意:在多进程是要确保多个进程使用的是同一把锁

XMind: ZEN - Trial Version

以上是关于mutilprocess模块的用法的主要内容,如果未能解决你的问题,请参考以下文章

Process类,Thread类,Pool类,gevent类,ProcessPoolExecutor,ThreadPoolExecutor的用法比较

Process的几个用法和守护进程

python的subprocess模块

Day 32 process&threading_4

python 执行系统命令---suprocess模块

node.js 全局变量process成员属性和用法