天天看點

【Python并發】【Python多程序(二)】程序間通信

【Python并發】【Python多程序(一)】建立程序

【Python并發】【Python多程序(二)】程序間通信

【Python并發】【Python多程序(三)】程序間資料共享

【Python并發】【Python多程序(四)】程序同步

Python中常見的程序間通信方式主要是隊列(Queue)和管道(Pipe)

一、隊列(Queue)

隊列主要用于多程序之間的通信,下面以生産者-消費者為例。

from multiprocessing import Process, Queue
import time, os

def prodcut(q):
    print("開始生産.")
    for i in range(5):
        time.sleep(1)
        q.put('産品'+str(i))
        print("産品"+str(i)+"生産完成")

def consume(q):
    while True:
        prod = q.get()
        print("消費者:{},消費産品:{}".format(os.getpid(), prod))
        time.sleep(1)

if __name__ == '__main__':
    q = Queue()
    p = Process(target=prodcut, args=(q, ))  # 生産者
    c1 = Process(target=consume, args=(q, ))  # 消費者1
    c2 = Process(target=consume, args=(q, ))  # 消費者2
    p.start()
    c1.start()
    c2.start()
    p.join()  # 當生産者結束後,将兩個消費則也結束
    c1.terminate()
    c2.terminate()
           

輸出:

開始生産.
産品0生産完成
開始生産.
消費者:20072,消費産品:産品0
産品1生産完成
開始生産.
消費者:21900,消費産品:産品1
産品2生産完成
開始生産.
消費者:20072,消費産品:産品2
産品3生産完成
開始生産.
消費者:21900,消費産品:産品3
産品4生産完成
消費者:20072,消費産品:産品4
           

二、管道(Pipe)

pipe的方式主要用于兩個程序間的通信,程序分别位于pipe的兩端。Pipe()方法會傳回管道的兩個端,分别用于發送和接收。

from multiprocessing import Pipe, Pool
import os,time

def product(send_pipe):
    print("開始生産.")
    for i in range(5):
        time.sleep(1)
        send_pipe.send("産品"+str(i))
        print("産品" + str(i) + "生産完成")

def consume(recv_pipe):
    while True:
        print("消費者:{},消費産品:{}".format(os.getpid(), recv_pipe.recv()))
        time.sleep(1)

if __name__ == '__main__':
    # 使用程序池來建立程序
    send_pipe, recv_pipe = Pipe()
    pool = Pool(2)
    pool.apply_async(product, args=(send_pipe,))
    pool.apply_async(consume, args=(recv_pipe,))
    pool.close()
    pool.join()
           

輸出:

開始生産.
産品0生産完成
消費者:25036,消費産品:産品0
産品1生産完成
消費者:25036,消費産品:産品1
産品2生産完成
消費者:25036,消費産品:産品2
産品3生産完成
消費者:25036,消費産品:産品3
産品4生産完成
消費者:25036,消費産品:産品4