Python多程式之資料交換Pipe

ckxllf發表於2021-03-02

  multiprocessing.Pipe()方法會返回一個管道(列表的形式)的兩個埠,一個埠作為輸入端,一個埠作為輸出端,如程式A的輸出可以作為程式B的輸入,程式B的輸出可以作為程式A的輸入,預設是全雙工模式。

  Pipe()方法返回的物件具有傳送訊息send()方法和接收訊息recv()方法。呼叫接收recv()方法時,如果管道中沒用訊息會一直阻塞,如果管道關閉,則會丟擲EOFError異常。

  示例:

  import multiprocessing

  import time

  def task1(pipe):

  for i in range(5):

  str = f"task1-{i}"

  print(f"{time.strftime('%H:%M:%S')} task1 傳送:{str}")

  pipe.send(str)

  time.sleep(2)

  for i in range(5):

  print(f"{time.strftime('%H:%M:%S')} task1 接收: { pipe.recv() }")

  def task2(pipe):

  for i in range(5):

  print(f"{time.strftime('%H:%M:%S')} task2 接收: { pipe.recv() }")

  time.sleep(1)

  for i in range(5):

  str = f"task2-{i}"

  print(f"{time.strftime('%H:%M:%S')} task2 傳送:{str}")

  pipe.send(str)

  if __name__ == "__main__":

  pipe = multiprocessing.Pipe()

  p1 = multiprocessing.Process(target=task1, args=(pipe[0],)) # pipe[0]管道傳送訊息的埠

  p2 = multiprocessing.Process(target=task2, args=(pipe[1],)) # pipe[1]管道接收訊息的埠

  p1.start()

  p2.start()

  p1.join()

  p2.join()

  輸出: 大連人流醫院

  17:23:53 task1 傳送:task1-0

  17:23:53 task1 傳送:task1-1

  17:23:53 task1 傳送:task1-2

  17:23:53 task1 傳送:task1-3

  17:23:53 task1 傳送:task1-4

  17:23:53 task2 接收: task1-0

  17:23:53 task2 接收: task1-1

  17:23:53 task2 接收: task1-2

  17:23:53 task2 接收: task1-3

  17:23:53 task2 接收: task1-4

  17:23:54 task2 傳送:task2-0

  17:23:54 task2 傳送:task2-1

  17:23:54 task2 傳送:task2-2

  17:23:54 task2 傳送:task2-3

  17:23:54 task2 傳送:task2-4

  17:23:55 task1 接收: task2-0

  17:23:55 task1 接收: task2-1

  17:23:55 task1 接收: task2-2

  17:23:55 task1 接收: task2-3

  17:23:55 task1 接收: task2-4

  說明:定義了兩個任務函式,task1先發5條訊息,再接收訊息,task2先接收訊息,再傳送訊息。呼叫time.sleep()只是讓輸出更好看點,不會影響管道的接收和傳送。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2760726/,如需轉載,請註明出處,否則將追究法律責任。

相關文章