मैं पाइथन के मल्टीप्रोसेसिंग मॉड्यूल के साथ पाइप का उपयोग करके प्रक्रियाओं के बीच सरल वस्तुओं को भेज रहा हूं। दस्तावेज़ीकरण में कहा गया है कि यदि एक पाइप बंद कर दिया गया है, तो pipe.recv() को कॉल करना EOFError को बढ़ाया जाना चाहिए। इसके बजाए, मेरा प्रोग्राम सिर्फ आरईवी() पर अवरुद्ध है और कभी पता नहीं लगाता कि पाइप बंद कर दिया गया है।pipe.clc() पाइथन मल्टीप्रोसेसिंग में pipe.recv() के दौरान EOFError क्यों नहीं करता है?
उदाहरण:
import multiprocessing as m
def fn(pipe):
print "recv:", pipe.recv()
print "recv:", pipe.recv()
if __name__ == '__main__':
p1, p2 = m.Pipe()
pr = m.Process(target=fn, args=(p2,))
pr.start()
p1.send(1)
p1.close() ## should generate EOFError in remote process
और उत्पादन की तरह दिखता है:
recv: 1
<blocks here>
किसी को भी मुझे बता सकते हैं मैं गलत क्या कर रहा हूँ? मुझे लिनक्स और विंडोज/साइगविन पर यह समस्या है, लेकिन विंडोज़ मूल पायथन के साथ नहीं है।
(बेशक यह सही है, लेकिन के रूप में यह विंडोज पर करता सवाल का उद्देश्य निर्धारित करने के लिए क्यों पाइप बंद माता-पिता और बच्चे प्रक्रिया के बीच संचार नहीं किया है और जैसा कि दस्तावेज़ीकरण से पता चलता है कि यह होना चाहिए)। – Luke
ठीक है, फिर से जांच करने पर, आप बिल्कुल सही हैं (और मैंने आपके उत्तर को सही ढंग से समझ नहीं लिया)। पाइप को 'बंद' नहीं माना जाता है जब तक कि फ़ाइल डिस्क्रिप्टर का उपयोग करने वाली सभी प्रक्रियाओं ने इसे बंद नहीं किया है। – Luke
इसका एक दिलचस्प/अजीब परिणाम यह है कि पाइप के दोनों सिरों को बाल प्रक्रियाओं में भेजना आवश्यक है ताकि वे स्पष्ट रूप से एक को बंद कर सकें। – Luke