zoukankan      html  css  js  c++  java
  • 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()
    
  • 相关阅读:
    已知前序中序后序中的两种,如何求另一种
    sql(上)例题
    sql语句顺序/包含执行顺序和书写顺序
    VScode中文乱码问题
    好用的后台管理模板Bootstrap3
    手把手教你用Typora自动上传到picgo图床【教程与排坑】
    解决GitHub网页githubusercontent地址无法访问问题
    Java学习+面试指南(转)
    Linux C/C++ 方向学习经验【转】
    Scrapy学习笔记(一)
  • 原文地址:https://www.cnblogs.com/TK-tank/p/12312949.html
Copyright © 2011-2022 走看看