簡體   English   中英

如何檢測multiprocessing.Pipe已滿?

[英]How to detect multiprocessing.Pipe is full?

問題描述:我正在Python中進行多處理,並使用multiprocessing.Pipe()在進程之間進行通信。 我已經進行了很多搜索,但是仍然找不到方法來檢測管道是否已滿。 例如,在下面的示例中,writePipe進程將數字繼續放入2個不同的管道(奇數和偶數)中,而readPipe進程從這2個管道中連續讀取數據。 但是,從奇數管道讀取的速度要快得多,因此偶數管道將充滿。 屆時,writePipe進程將被阻塞,而readPipe進程仍繼續等待從奇數管道讀取數據,這將導致死鎖。

我的問題:有什么方法可以檢測到管道已滿,以便在仍運行時停止將數字放入已滿的管道中,而將數字放入仍然有空格的管道中?

from multiprocessing import Process, Pipe


def writePipe(sendNumberOdd, sendNumberEven):
    i = 0
    while True:
        if i % 2 == 0:
            sendNumberEven.send(i)
        else:
            sendNumberOdd.send(i)
        i += 1

def readPipe(recvNumberOdd, recvNumberEven):
    countEven = 0
    while True:
        countEven += 1
        print(countEven, recvNumberEven.recv())

        countOdd = 0
        while countOdd < 50:
            countOdd += 1
            print (countOdd, recvNumberOdd.recv())



if __name__ == '__main__':
    recvNumberOdd, sendNumberOdd = Pipe(duplex=False)
    recvNumberEven, sendNumberEven = Pipe(duplex=False)

    write = Process(target=writePipe, args=(sendNumberOdd, sendNumberEven))
    read = Process(target=readPipe, args=(recvNumberOdd, recvNumberEven))
    write.start()
    read.start()

    sendNumberOdd.close()
    sendNumberEven.close()

提案未完成

 class Connection(multiprocessing.Connection): def __init__(self, maxsize=0): self.__maxsize = maxsize self.size = 0 self.__lock = multiprocessing.Lock def send(self, obj): with self.__lock: self.size += sizeof(obj) super().send(obj) def recv(self): _recv = super().recv() with self.__lock: self.size -= sizeof(_recv) return _recv def full(self): if self.__maxsize > 0: return self.size >= self.__maxsize return None def Pipe(maxsize=0, duplex=True): return Connection(maxsize), Connection(maxsize) 

實現poll()以檢查是否有任何可用的數據。

Python»文檔: poll([timeout])

 Return whether there is any data available to be read. 

例如:

if recvNumberEven.poll():
    countEven += 1
    print(countEven, recvNumberEven.recv())

兩者的替代使用wait(...)

multiprocessing.connection.wait(object_list,timeout = None)

 Wait till an object in object_list is ready. Returns the list of those objects in object_list which are ready. 

您可以使用select模塊中的select函數來執行輸出管道是否已滿的測試。

import select
import multiprocessing.connection as mpc


def pipe_full(conn):
    r, w, x = select.select([], [conn], [], 0.0)
    return 0 == len(w)


i, o = mpc.Pipe(duplex=False)

n = 0
while not pipe_full(o):
    o.send(n)
    n += 1

print('{} items fit.'.format(n))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM