मुझे समझ में नहीं आता क्यों Pipes
असुरक्षित कहा जाता है जब एकाधिक प्रेषक और रिसीवर होते हैं।पाइथन मल्टीप्रोसेसिंग पाइप असुरक्षित क्यों हैं?
कैसे निम्नलिखित कोड का उपयोग कर Queues
ऐसा तो नहीं है कोड में तब्दील किया जा सकता है? Queues
बंद होने पर EOFError
फेंक न दें, इसलिए मेरी प्रक्रियाएं रोक नहीं सकती हैं। क्या मुझे अंतहीन रूप से 'जहर' संदेश भेजना चाहिए ताकि उन्हें रोकने के लिए कहा जा सके (इस तरह, मुझे यकीन है कि मेरी सभी प्रक्रियाओं में कम से कम एक जहर प्राप्त होता है)?
मैं जब तक मैं नहीं तो तय (यहां यह जब मैं 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' और 'पाइप' का उपयोग करते समय' multiprocessing.Lock() 'का उपयोग करता हूं तो क्या होगा? क्या यह सुरक्षित (और कुशल) बन जाएगा? – thuzhf
यदि आप ऐसा करते हैं, तो आप मूल रूप से 'कतार' के साथ समाप्त हो जाएंगे - 'मल्टीप्रोसेसिंग। क्यूयू' एक 'पाइप' है जो ताले की एक जोड़ी से जुड़ी है (प्रत्येक दिशा के लिए एक)। तो, यह सुरक्षित और उचित रूप से कुशल होगा, लेकिन आप सीधे पहिया को फिर से शुरू कर देंगे - क्यों न केवल 'कतार' का उपयोग करें? – nneonneo