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

2020-03-01  本文已影响0人  TheRightPath1

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)
上一篇下一篇

猜你喜欢

热点阅读