python多进程————10、进程间的通信-Queue、Manager、Pipe

一、Queue

这里提到的队列模块大概有三个:

 1、from queue import Queue  (此模块适用于线程间通信,但不能用于进程间通信)

 2、from multiprocessing import Queue (可以用于多进程,但不能用于进程池)

import time
from multiprocessing import Process,Queue
import queue


def producer(queue):
    queue.put("a")
    time.sleep(2)

def consumer(queue):
    time.sleep(2)
    data = queue.get()
    print(data)

if __name__ == "__main__":
    #queue = queue.Queue()
    queue = Queue()
    my_producer = Process(target=producer,args=(queue,))
    my_consumer = Process(target=consumer,args=(queue,))
    my_producer.start()
    my_consumer.start()
    my_producer.join()
    my_consumer.join()
#使用queue模块的Queue()会报错
#使用multiprocessing中的Queue(),正确输出a


 3、from multiprocessing import Mnage

import time
from multiprocessing import Process,Queue,Pool,Manager


def producer(queue):
    queue.put("a")
    time.sleep(2)

def consumer(queue):
    time.sleep(2)
    data = queue.get()
    print(data)

if __name__ == "__main__":
    #queue = Queue()
    queue = Manager().Queue()
    pool = Pool()
#pool中的进程间通信需要使用Manager
    pool.apply_async(producer,args=(queue,))
    pool.apply_async(consumer, args=(queue,))
    pool.close()
    pool.join()

 

二、共享变量

      共享变量不适用于多进程,进程间的变量是互相隔离的,子进程的全局变量是完全复制一份父进程的数据,对子进程的全局变量修改完全影响不到其他进程的全局变量

def producer(a):
    a += 1
    time.sleep(2)

def consumer(a):
    time.sleep(3)
    data = a
    print(data)

if __name__ == "__main__":
    a = 1
    my_producer = Process(target=producer,args=(a,))
    my_consumer = Process(target=consumer,args=(a,))
    my_producer.start()
    my_consumer.start()
    my_producer.join()
    my_consumer.join()

#输出结果为1

三、管道Pipe(两进程间的通信优先考虑)

import time
from multiprocessing import Process,Queue,Pool,Manager,Pipe
def producer(pipe):
    pipe.send("a")
    time.sleep(3)
    print(pipe.recv())

def consumer(pipe):
    time.sleep(2)
    data = pipe.recv()
    pipe.send("b")
    print(data)

if __name__ == "__main__":
    #Pipe实现两进程间通信
    s_pipe,r_pipe = Pipe()
    pool = Pool()
    pool.apply_async(producer,args=(s_pipe,))
    pool.apply_async(consumer, args=(r_pipe,))
    pool.close()
    pool.join()

四、Manager

manager中的一些数据结构,dict使用(类似共享变量)

import time
from multiprocessing import Process,Queue,Pool,Manager,Pipe
import queue
def add_data(p_dict,key,value):
    p_dict[key] = value
if __name__ == "__main__":
    progress = Manager().dict()
    first_progress = Process(target=add_data,args=(progress,"a",1))
    second_process = Process(target=add_data,args=(progress,"b",2))
    first_progress.start()
    second_process.start()
    first_progress.join()
    second_process.join()
    print(progress)

猜你喜欢

转载自blog.csdn.net/sinat_34461756/article/details/83931711