1. 程式人生 > >python多程序————10、程序間的通訊-Queue、Manager、Pipe

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)