1. 程式人生 > >ython實現程序間的通訊有Queue,Pipe,Value+Array等,其中Queue實現多個程序間的通訊,而Pipe實現兩個程序間通訊,而Value+Array使用得是共享記憶體對映檔案的方式,所以速度比較快

ython實現程序間的通訊有Queue,Pipe,Value+Array等,其中Queue實現多個程序間的通訊,而Pipe實現兩個程序間通訊,而Value+Array使用得是共享記憶體對映檔案的方式,所以速度比較快

1.Queue的使用

from multiprocessing import Queue,Process
import os,time,random

#新增資料函式
def proc_write(queue,urls):
    print("程序(%s)正在寫入..."%(os.getpid()))
    for url in urls:
        queue.put(url)
        print("%s被寫入到佇列中"%(url))
        time.sleep(random.random()*3)

#讀取資料函式
def proc_read(queue):
    print("程序(%s)正在讀取..."%(os.getpid()))

    while True:
        url = queue.get();
        print("從佇列中提取到:%s"%(url))

if __name__ =="__main__":
    queue = Queue()
    proc_writer1 = Process(target=proc_write,args=(queue,["ur1","ur2","ur3","ur4"]))
    proc_writer2 = Process(target=proc_write,args=(queue,["ur5","ur6","ur7","ur8"]))
    proc_reader = Process(target=proc_read,args=(queue,))
    proc_writer1.start()
    proc_writer2.start()
    proc_reader.start()
    proc_writer1.join()
    proc_writer2.join()
    proc_reader.terminate()

2.Pipe的使用

pipe用於兩個程序間的通訊,兩個程序分別位於管道的兩端,Pipe方法返回(conn1,conn2)代表一個管道的兩端,Pipe方法有dumplex引數,若該引數為True,管道為全雙工模式,若為Fasle,conn1只負責接收訊息,conn2只負責傳送訊息.send和recv方法分別是傳送和接收訊息的方法,例如,在全雙工模式下,可以呼叫conn1.send傳送訊息,conn1.recv接收訊息,如果沒有訊息可以接收,recv方法會一直阻塞,如果管道已經被關閉,recv方法會丟擲EOFError

from multiprocessing import Pipe,Process
import random,time,os

def proc_send(pipe,urls):
    for url in urls:
        print("程序(%s)傳送:%s"%(os.getpid(),url))
        pipe.send(url)
        time.sleep(random.random())

def proc_recv(pipe):
    while True:
        print("程序(%s)接收到:%s"%(os.getpid(),pipe.recv()))
        time.sleep(random.random())

if __name__ == "__main__":
    pipe = Pipe()
    p1 = Process(target=proc_send,args=(pipe[0],["url_"+str(i) for i in range(10)],))
    p2 = Process(target=proc_recv,args=(pipe[1],))
    p1.start()
    p2.start()
    p1.join()
    p2.terminate()