python 多進程-進階-進程間通信之Pipe

    Pipe常用來在兩個進程間進行通信,兩個進程分別位於管道的兩端。

    Pipe方法返回(conn1, conn2)代表一個管道的兩個端。Pipe方法有duplex參數,如果duplex參數爲True(默認值),那麼這個參數是全雙工模式,也就是說conn1和conn2均可收發。若duplex爲False,conn1只負責接收消息,conn2只負責發送消息。send和recv方法分別是發送和接受消息的方法。例如,在全雙工模式下,可以調用conn1.send發送消息,conn1.recv接收消息。如果沒有消息可接收,recv方法會一直阻塞。如果管道已經被關閉,那麼recv方法會拋出EOFError。

    示例:創建兩個進程,一個子進程通過Pipe發送數據,一個子進程通過Pipe接收數據。

# -*- coding: utf-8 -*-
# User: jier
# QQ: 2276845534
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()

    輸出信息爲:

Process (12148) send: url_0
Process (18820) rev: url_0
Process (12148) send: url_1
Process (18820) rev: url_1
Process (12148) send: url_2
Process (12148) send: url_3
Process (18820) rev: url_2
Process (12148) send: url_4
Process (18820) rev: url_3
Process (12148) send: url_5
Process (18820) rev: url_4
Process (12148) send: url_6
Process (18820) rev: url_5
Process (18820) rev: url_6
Process (12148) send: url_7
Process (18820) rev: url_7
Process (12148) send: url_8
Process (18820) rev: url_8
Process (12148) send: url_9
Process (18820) rev: url_9

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章