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)