क्रैश नहीं करता है मुझे पाइथन मल्टीप्रोसेसिंग मॉड्यूल में समस्या हो रही है। मैं अपने दूसरे कोर का उपयोग करने के लिए एक नई प्रक्रिया को बढ़ाने के लिए Process
कक्षा का उपयोग कर रहा हूं। यह दूसरी प्रक्रिया रैम में डेटा का एक गुच्छा लोड करती है और फिर खपत के बजाय धैर्यपूर्वक इंतजार करती है।बच्चे multiprocessing.Process से कोई प्रिंट आउटपुट जब तक प्रोग्राम
मैं देखना चाहता था कि print
कमांड के साथ मुद्रित प्रक्रिया क्या है, हालांकि, मुझे प्रिंट करने वाली कुछ भी दिखाई नहीं देती है। मैं केवल देखता हूं कि मूल प्रक्रिया प्रिंट करता है। अब यह मुझे समझ में आता है क्योंकि वे दो अलग-अलग प्रक्रियाओं में रहते हैं। दूसरी प्रक्रिया अपने स्वयं के खोल/मानक आउटपुट विंडो को नहीं बढ़ाती है, न ही इसका आउटपुट माता-पिता को भेजा जाता है। फिर भी जब यह प्रक्रिया दुर्घटनाग्रस्त हो जाती है, तो यह सब कुछ प्रिंट करता है जो मेरी स्क्रिप्ट ने प्रिंट करने के लिए कहा था, साथ ही स्टैक ट्रेस और त्रुटि।
मुझे आश्चर्य है कि क्या पहली प्रक्रिया में बाल प्रक्रिया के प्रिंट आउटपुट को भेजने का एक आसान तरीका है, या यह एक खोल/मानक आउटपुट उत्पन्न कर रहा है ताकि मैं इसे डीबग कर सकूं। मुझे पता है कि मैं प्रिंटर को माता-पिता को प्रेषित करने के लिए समर्पित multiprocessing.Queue
बना सकता हूं ताकि यह मानक आउटपुट पर प्रिंट कर सके, लेकिन यदि कोई आसान समाधान मौजूद है तो मुझे ऐसा करने में ऐसा नहीं लगता है।
कमाल! हाँ वास्तव में काम किया। यह sys.stdout.flush() क्या करता है? क्या यह स्पष्ट रूप से प्रिंट को स्टडआउट करने के लिए मजबूर करता है? फिर से Thx! –
यह बफर साफ़ करता है। Stdout तब तक सहेजा जाता है जब तक कि आपके पास पूर्ण बफर न हो। फ्लश इंतजार बंद कर देता है। यह देखने के लिए stderr पर प्रिंट करने का प्रयास करें कि यह क्या करता है। कभी-कभी यह unbuffered है। –
@ निकोलस: कोई समस्या नहीं :) जब subprocesses चलाते हैं तो उनके मानक आउटपुट को आमतौर पर buffered किया जाता है (और उनकी मानक त्रुटि आमतौर पर नहीं होती है), एसएलॉट ने इसका अर्थ समझाया। आप बफरिंग को रोकने के लिए अलग-अलग चाल का प्रयास कर सकते हैं, लेकिन sys.stdout.flush() का उपयोग करना याद रखना सरल है और हमेशा काम करता है। – orip