Python 進程間的通訊

#-*-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

相關文章
相關標籤/搜索