• 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()
    
  • 相关阅读:
    PouchDB:一款受CouchDB启发的离线Web数据库
    如何使用JPA注解映射枚举类型
    重新排列参数
    sql不同数据处理方式完成同一处理结果对日志增长的影响
    那些让我念念不忘的 Firefox 扩展
    Linux现可运行于Windows Azure上
    Vector Fabrics推出多核软件优化工具Pareon
    分解公式 sql
    sql树形数据生成xml
    Microsoft .NET终于提供了一个通用的Zip库
  • 原文地址:https://www.cnblogs.com/TK-tank/p/12312949.html
Copyright © 2020-2023  润新知