103.多进程

多进程

  • 多个进程间无任何共享状态
  • 进程间有时需要交换数据,进程间通讯(InterprocessCommunication, IPC)

创建进程

  • 直接生成Process实例
  • 派生子类生成实例
    • init函数:和threading一样,只要写此函数就要调用父类的init函数
    • run函数:实际执行函数
import time
import multiprocessing

class MulProcess(multiprocessing.Process):
    
    def __init__(self,arg):
        super().__init__()
        self.arg = arg

    def run(self):

        while True:
            print(time.ctime())
            time.sleep(self.arg)

if __name__ == "__main__":
    p = MulProcess(2)
    p.start()

查询当前进程和父进程id的函数

  • os.ppid() 查询父进程ID
  • os.pid() 查询本进程ID

JoinableQueue 多进程队列

  • JoinableQueue是multiprocessing的方法
  • 生产者消费者模型
import time
import multiprocessing

def scz(l, q):
    for i in l:
        #放入产品
        q.put(i)
        print("放入产品:" , i , time.ctime())

def xfz(q):
    while True:
        print("消费产品:" , q.get() , time.ctime())
        #发出信号通知任务完成
        q.task_done()

if __name__ == "__main__":
    #实例化进程队列
    q = multiprocessing.JoinableQueue()
    #实例化线程
    p = multiprocessing.Process(target=xfz, args=(q,))
    #守护进程,主进程结束,子进程也跟着结束
    p.daemon = True
    p.start()
    
    l = [i for i in range(1,5)]
    scz(l,q)
    #等待队列中所有项都处理完成
    q.join()
  • 哨兵值
  • 认为放入一个特殊值,当消费者取出哨兵值时,执行相应的操作
  • 有几个进程就放入几个哨兵值
  • 例:哨兵值为None 当消费者取出值时判断,如果是哨兵值就跳出循环结束
import time
import multiprocessing

def scz(l, q):
    for i in l:
        q.put(i)
        print("放入产品:" , i , time.ctime())

def xfz(q):
    while True:
        a = q.get()
        if a is None:
            break
        else:
            print("消费产品:" , a , time.ctime())

if __name__ == "__main__":
    q = multiprocessing.JoinableQueue()
    
    p = multiprocessing.Process(target=xfz, args=(q,))
    p.start()
    p1 = multiprocessing.Process(target=xfz, args=(q,))
    p1.start()
    
    l = [i for i in range(1,5)]
    scz(l,q)

    q.put(None)
    q1.put(None)
 
    q.join()
    q.join()
posted @ 2020-02-15 17:56  TK_tank  阅读(127)  评论(0编辑  收藏  举报