在我的應用程序中,我使用多處理模塊中的管道在python進程之間進行通信。 最近我觀察到一個奇怪的行爲,這取決於我通過它們發送的數據的大小。 根據python文檔,這些管道是基於連接的,並且應該以異步方式運行,但有時他們會在發送時卡住。如果我在每個連接中啓用全雙工,即使我沒有使用連接進行發送和收聽,一切正常。 任何人都可以解釋這種行爲?Python管道的同步/異步行爲
- 100輛彩車,全雙工禁用
代碼工作,利用asynchronousness。 - 100浮動,全雙工啓用
該示例正常工作正常。 - 10000浮點數,全雙工禁用
儘管數據量較小,但執行永遠被阻止。 - 10000浮點數,全雙工啓用
再次罰款。
代碼(這不是我的生產代碼,它只是說明我的意思):
from collections import deque
from multiprocessing import Process, Pipe
from numpy.random import randn
from os import getpid
PROC_NR = 4
DATA_POINTS = 100
# DATA_POINTS = 10000
def arg_passer(pipe_in, pipe_out, list_):
my_pid = getpid()
print "{}: Before send".format(my_pid)
pipe_out.send(list_)
print "{}: After send, before recv".format(my_pid)
buf = pipe_in.recv()
print "{}: After recv".format(my_pid)
if __name__ == "__main__":
pipes = [Pipe(False) for _ in range(PROC_NR)]
# pipes = [Pipe(True) for _ in range(PROC_NR)]
pipes_in = deque(p[0] for p in pipes)
pipes_out = deque(p[1] for p in pipes)
pipes_in.rotate(1)
pipes_out.rotate(-1)
data = [randn(DATA_POINTS) for foo in xrange(PROC_NR)]
processes = [Process(target=arg_passer, args=(pipes_in[foo], pipes_out[foo], data[foo]))
for foo in xrange(PROC_NR)]
for proc in processes:
proc.start()
for proc in processes:
proc.join()
謝謝您的詳細解答。現在我明白了這個問題。 – Michal 2013-04-29 06:25:54