管道,進程間數據共享,進程池

一:管道spa

使用:from multiprocessing import Process,Pipe對象

知識:進程

1 建立管道時候:Pipe()默認是雙工的,如改爲False,那麼conn1只能接收,conn2只能發送。ip

conn1,conn2=Pipe()

2 Pipe模塊發送字符串不用bytes類型,直接是字符串類型。字符串

Pipe([duplex]):在進程之間建立一條管道,並返回元組(conn1,conn2),其中conn1,
conn2表示管道兩端的鏈接對象,強調一點:必須在產生Process對象以前產生管道.
#參數介紹:
dumplex:默認管道是全雙工的,若是將duplex設置成False,conn1只能用於接收,conn2只能用於發送。
#主要方法:
    conn1.recv():接收conn2.send(obj)發送的對象。若是沒有消息可接收,recv方法會一直阻塞。
    若是鏈接的另一端已經關閉,那麼recv方法會拋出EOFError。
    conn1.send(obj):經過鏈接發送對象。obj是與序列化兼容的任意對象
 #其餘方法:
conn1.close():關閉鏈接。若是conn1被垃圾回收,將自動調用此方法
conn1.fileno():返回鏈接使用的整數文件描述符
conn1.poll([timeout]):若是鏈接上的數據可用,返回True。timeout指定等待的最長時限。
若是省略此參數,方法將當即返回結果。若是將timeout射成None,操做將無限期地等待數據到達。

進程之間一個接收信息,一個發送消息get

# from multiprocessing import  Process,Pipe
# def func(conn):
#     conn.send('hello')
#     conn.close()
# if __name__=='__main__':#判斷是不是當前文件的文件名,若是是執行下面
#     conn1,conn2=Pipe()
#     p=Process(target=func,args=(conn1,))
#     p.start()
#     print(conn2.recv())
#     # conn2.close()   注意 這個不寫,我是寫的錯誤的,這行去掉
#     p.join()

打印結果:一個helloimport

若是是進程之間接收多條消息的時候,不是一條,須要傳遞多個對象(形參是兩個),執行一個時候,另外一個關閉。file

from multiprocessing import Process,Pipe
def func(conn1,conn2):
    conn2.close()
    while True:
        try:
            msg=conn1.recv()
            print(msg)
        except EOFError:
            conn1.close()
            break
if __name__=='__main__':
    conn1,conn2=Pipe()
    Process(target=func,args=(conn1,conn2)).start()
    conn1.close()
    for i in range(20):
        conn2.send('hello')
    conn2.close()

打印結果:20個hello垃圾回收

相關文章
相關標籤/搜索