• PYTHON——多进程:进程间通信和数据共享


    1、采用Queue队列通信

    from multiprocessing import Process, Queue
    
    def f(q,n):
        q.put([42, n, 'hello'])
    
    if __name__ == '__main__':
        q = Queue()
        p_list=[]
        for i in range(3):
            p = Process(target=f, args=(q,i))
            p_list.append(p)
            p.start()
        print(q.get())
        print(q.get())
        print(q.get())
        for i in p_list:
            i.join()

    2、采用Pipe管道通信

    '''
    由PIPER()返回的两个连接对象表示管道的两端。
    每个连接对象都有SeNe()和ReCVE()方法(除其他之外)。
    注意,如果两个进程(或线程)试图同时从管道的同一端读取或写入数据,
    那么管道中的数据可能会损坏。
    当然,在使用管道的不同端部的过程中不存在腐败风险。
    '''
    from multiprocessing import Process, Pipe
    
    def f(conn):
        conn.send([42, None, 'hello']) #子进程发送
        conn.close()
    
    if __name__ == '__main__':
        parent_conn, child_conn = Pipe()
        p = Process(target=f, args=(child_conn,))
        p.start()
        print(parent_conn.recv())  # 主进程接收 prints "[42, None, 'hello']"
        p.join()

    3、采用Manager管理器对象通信

      Manager用于管理数据共享

    '''
    Manager()返回的管理器对象控制保存Python对象的服务器进程,
    并允许其他进程使用代理操作它们。
    Manager()返回的管理器将支持类型:list,dict, Namespace, Lock, RLock,
    Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value and Array
    '''
    from multiprocessing import Process, Manager
    
    def f(d, l,n):
        d[n] = '1'
        d['2'] = 2
        d[0.25] = None
        l.append(n)
        print(l)
    
    if __name__ == '__main__':
        with Manager() as manager:  #with 类似 f = Open()格式
            d = manager.dict()
            l = manager.list(range(5))
            p_list = []
            for i in range(10):
                p = Process(target=f, args=(d, l,i))
                p.start()
                p_list.append(p)
            for res in p_list:
                res.join()
    
            print(d)
            print(l)
  • 相关阅读:
    js 常见业务数据数组转换操作 时间复杂度降级O(n)的尝试
    【20220226】连岳摘抄
    【20220227】连岳摘抄
    【20220301】连岳摘抄
    【20220225】连岳摘抄
    【20220228】连岳摘抄
    【20220224】事情还是要乐观对待
    Atcoder Beginner Contest 208 F Cumulative Sum(拉格朗日插值)
    Solution 「CF 1622F」Quadratic Set
    Solution 「CF 923F」Public Service
  • 原文地址:https://www.cnblogs.com/chenhaiming/p/9919394.html
Copyright © 2020-2023  润新知