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

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)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容