ython實現程序間的通訊有Queue,Pipe,Value+Array等,其中Queue實現多個程序間的通訊,而Pipe實現兩個程序間通訊,而Value+Array使用得是共享記憶體對映檔案的方式,所以速度比較快
阿新 • • 發佈:2018-11-07
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()