여러 발신자와 수신자가있는 경우 Pipes
이 안전하지 않은 이유를 알지 못합니다.파이썬 다중 처리 파이프가 안전하지 않은 이유는 무엇입니까?
Queues
을 사용하여 다음 코드를 코드로 변환하는 방법은 무엇입니까? Queues
닫히면 EOFError
을 던지지 않으므로 프로세스가 멈추지 않습니다. 끝내기 위해 'Poison'메시지를 보내야합니다 (이 방법으로 모든 프로세스에 적어도 하나의 독이 있음을 확신합니다).
그렇지 않으면 (내가 여기에 10 개의 메시지를 보냈을 때까지) 나는 파이프 p1
을 열어두고 싶습니다.
from multiprocessing import Pipe, Process
from random import randint, random
from time import sleep
def job(name, p_in, p_out):
print(name + ' starting')
nb_msg = 0
try:
while True:
x = p_in.recv()
print(name + ' receives ' + x)
nb_msg = nb_msg + 1
p_out.send(x)
sleep(random())
except EOFError:
pass
print(name + ' ending ... ' + str(nb_msg) + ' message(s)')
if __name__ == '__main__':
p1_in, p1_out = Pipe()
p2_in, p2_out = Pipe()
proc = []
for i in range(3):
p = Process(target=job, args=(str(i), p1_out, p2_in))
p.start()
proc.append(p)
for x in range(10):
p1_in.send(chr(97+x))
p1_in.close()
for p in proc:
p.join()
p1_out.close()
p2_in.close()
try:
while True:
print(p2_out.recv())
except EOFError:
pass
p2_out.close()
파이프의'recv'와'send'를 사용할 때'multiprocessing.Lock()'을 사용하면 어떨까요? 안전한가 (그리고 효율적인가)? – thuzhf
이렇게하면 기본적으로'Queue' -'다중 처리 '로 끝날 것입니다 .Queue는 잠금 쌍이 첨부 된 (각 방향에 하나씩)'Pipe'입니다. 따라서 안전하고 합리적으로 효율적이지만, 바퀴 달린 자전거를 직접 개조해야합니다. 왜 '대기열'을 사용하지 않을까요? – nneonneo