13.二、進程的通訊:Queue、Pipe、


內容相關:

概念:進程的通訊socket

Queue:建立與使用spa

Pipe:建立與使用code


進程通訊的概念

  • 進程的資源空間是相互獨立的,通常而言是不能相互訪問的。但不少狀況下進程間須要互相通訊,來完成系統的某項功能。進程經過與內核及其它進程之間的互相通訊來協調它們的行爲。
  • 通訊方法:
    • 數據傳輸:一個進程將它的數據發送給另外一個進程【如socket通常,把須要通訊的數據傳輸給對方】
    • 管道:使用一片獨立的區域【不在雙方的資源空間中】,像一個有兩個口的倉庫同樣,廠家負責在東門把產品放到倉庫,司機負責在西門拉走產品
    • 資源共享:約定一片區域,雙方均可以隨意取放
    • 消息隊列:這也是一個獨立的區域,足夠權限的進程能夠向隊列中添加消息,被賦予讀權限的進程則能夠讀走隊列中的消息

 


Queue:

  • 能夠使用隊列multiprocessing.Queue來進行進程通訊

Queue 在multiprocessing 模塊中:from multiprocessing import Queue對象

  • Queue的使用:
    • 1.建立對象:Queue對象=Queue()
    • 2.傳入對象:要在主進程外使用Queue對象,須要做爲參數傳入image
    • 3.操做對象:【獲取元素:Queue對象.get()】、【放入元素:Queue對象.put(元素)】
#Queue在multiprocessing中
from multiprocessing import  Queue,Process

def f(q):#要在主進程外使用,須要做爲參數傳入
    q.put(['helloworld'])
    

def m(q):
    print("get in p2:",q.get())

if __name__=="__main__":
    q=Queue()
    p=Process(target=f,args=(q,))
    p.start()
    p2=Process(target=m,args=(q,))
    p2.start()


Pipe:

  • 能夠使用管道Pipe來進行進程通訊

Pipe 在multiprocessing 模塊中:from multiprocessing import Pipeblog

  • Pipe的使用:
    • 1.建立對象:第一個Pipe對象,第二個Pipe對象=Pipe(),返回兩個對象,第一個對象只能發,第二個對象只能收
    • 2.傳入對象:在要發送的進程,傳入第一個Pipe對象;在要接收的進程,傳入第二個Pipe對象image
    • 3.操做對象:【獲取元素:第一個對象.recv()】、【放入元素:第二個對象.send(元素)】
    • 4.操做完成後關閉管道:第一個對象.close(),第一個對象.close()
from multiprocessing import Pipe,Process

def f(conn):
    a=[1,2,3,4]
    conn.send(a)
    conn.close()
def m(conn):
    a=conn.recv()
    conn.close()


if __name__=="__main__":
    parent_conn,child_conn=Pipe()#返回兩個值,第一個只能發,第二個只能收
    p1=Process(target=f,args=(child_conn,))
    p2 = Process(target=m, args=(parent_conn,))#
    p1.start()
    p2.start()
    p1.join()
    p2.join()
相關文章
相關標籤/搜索