美文网首页
python进线程——多进程间的通信

python进线程——多进程间的通信

作者: TheRightPath1 | 来源:发表于2020-03-01 18:25 被阅读0次

    1. 进程间与线程间通信区别

    (1)线程间通信的类与锁在进程间是不适用的,必须使用multiprocessing中的queue.
    (2)共享全局变量的方式也不适用. 因为在多进程中每个进程间的数据都是独立的, 进程会将相同的变量复制一份用到自己的进程中.
    (3)multiprocessing中的queue不能用于进程池中进程间的通信, 如果使用的话代码不会运行
    (4)进程池中进程间的通信需要使用multiprocessing中的Manager类,Manager类实例化以后会有一个Queue,需要使用这个Queue进行通信

    2. 使用pipe进行进程间的通信

    pipe的通信只能适用于两个进程的通信, 并且pipe的通信效率要高于Queue,因为Queue中为了能够进程同步添加了许多的锁.

    代码示例\

    import time
    import multiprocessing
    
    
    def send_data(pipe):
        # 向pipe中发送数据
        pipe.send('test_data')
    
    
    def recv_data(pipe):
        # 接收pipe中的数据
        print(pipe.recv())
    
    
    if __name__ == '__main__':
        # pipe通信需要有两个, 一个用来发送,一个用来接收
        receive_pipe, send_pipe = multiprocessing.Pipe()
        p1 = multiprocessing.Process(target=send_data, args=(send_pipe,))
        p2 = multiprocessing.Process(target=recv_data, args=(receive_pipe,))
        p1.start()
        p2.start()
        p1.join()
        p2.join()
    

    3.使用Manager类进行python间进程共享内存

    代码示例

    import multiprocessing
    
    
    def add_data(p_dict, key, value):
        p_dict[key] = value
    
    
    if __name__ == '__main__':
        # 通过Manager()类中的dict实现两个进程共享一个字典
        p_dict = multiprocessing.Manager().dict()
        p1 = multiprocessing.Process(target=add_data, args=(p_dict, 'key1', 'value1'))
        p2 = multiprocessing.Process(target=add_data, args=(p_dict, 'key2', 'value2'))
        p1.start()
        p2.start()
        p1.join()
        p2.join()
        print(p_dict)
    

    相关文章

      网友评论

          本文标题:python进线程——多进程间的通信

          本文链接:https://www.haomeiwen.com/subject/ojockhtx.html