#-*-coding:utf-8-*- '''python提供了多種進程間的通訊方式,如:Queue,Pipe,Valie+Array等。 Queue與Pipe的區別在於Pipe經常使用來在兩個進程間通訊,Queue用來在多個進程間通訊 Queue: Put:用於插入數據到隊列中(blocked,timeoutl兩個可選參數,若是blocked爲True(默認值) 而且timeout爲正值,該方法會阻塞timeout指定時間,指導隊列有剩餘空間,若是超時,會拋出Queue.Full異常, 若是blocked爲False,但Queue已滿,會當即拋出Queue.Full異常) Get:從隊列讀取並刪除一個元素(blcoked,timeout兩個可選參數,若是blocked爲True(默認值)而且timeout爲正值 name在等待時間內沒有取到任何元素,會拋出Queue.Empty異常。若是blocked爲False,則分爲兩種狀況: 若是Queue有一個值可用,則當即返回該值;不然若是隊列爲空,則當即拋出Queue.Empty異常) ''' #例子:在父進程中建立三個子進程,兩個資金長王Queue中寫入數據一個進程從Queue中讀取數據 # from multiprocessing import Process,Queue # import os,time,random # # #寫數據進程執行的代碼: # def proc_write(q,urls): # print('Process(%s) is writing...'%os.getcwd()) # for url in urls: # q.put(url) # print('Put %s to queue...'%url) # time.sleep(random.random()) # #讀數據進程執行的代碼: # def proc_read(q): # print('Process(%s) is reading...'%os.getpid()) # while True: # url=q.get(True) # print('get %s from queue.'%url) # if __name__=="__main__": # #父進程建立Queue,並傳遞給各個子進程 # q=Queue() # proc_write1=Process(target=proc_write,args=(q,['url_1','url_2','url_3'])) # proc_write2=Process(target=proc_write,args=(q,['url_4','url_5','url_6'])) # proc_reader=Process(target=proc_read,args=(q,)) # #啓動子進程proc_writer寫入 # proc_write1.start() # proc_write2.start() # #啓動子進程proc_reader讀取 # proc_reader.start() # #等待proc_writer結束: # proc_write1.join() # proc_write2.join() # #proc_reader進程裏是死循環沒法等待其結束,只能強行終止 # from multiprocessing import Pipe '''Pipe經常使用在兩個進程間進行通訊,兩個進程分別位於進程兩端,Pipe方法返回(conn1,conn2)表明一個 管道的兩端。Pipe方法有duplex參數,若是duplex爲True(默認值)name這個管道是全雙工模式,也就是說 conn1和conn2都可以收發,若是duplex爲False,conn1只負責接收消息,conn2只負責發送消息。send 和recv方法分別是發送和接收消息的方法''' #建立兩個進程,一個進程經過Pipe發送數據一個進程經過Pipe接收數據 import multiprocessing import random import time,os def proc_send(pipe,urls): for url in urls: print("Process(%s) send: %s" %(os.getpid(),url)) pipe.send(url) time.sleep(random.random()) def proc_recv(pipe): while True: print("Process(%s) rev:%s"%(os.getpid,pipe.recv())) time.sleep(random.random()) if __name__=="__main__": pipe=multiprocessing.Pipe() p1=multiprocessing.Process(target=proc_send,args=(pipe[0],['url_'+str(i) for i in range(10)])) p2=multiprocessing.Process(target=proc_recv,args=(pipe[1],)) p1.start() p2.start() p1.join() p2.join()
摘自《Python爬蟲開發與項目實戰》python