मैं रेंडरफार्म पर काम कर रहा हूं, और मुझे अपने क्लाइंट को रेंडरर के कई उदाहरण लॉन्च करने में सक्षम होने की आवश्यकता है, बिना अवरुद्ध किए, ताकि क्लाइंट नए आदेश प्राप्त कर सके। मुझे यह सही ढंग से काम कर रहा है, हालांकि मुझे बनाई गई प्रक्रियाओं को समाप्त करने में परेशानी हो रही है।पायथन मल्टीप्रोसेसिंग पूल
वैश्विक स्तर पर, मैं अपने पूल को परिभाषित (ताकि मैं इसे किसी भी समारोह से उपयोग कर सकते हैं):
p = Pool(2)
मैं तो apply_async के साथ मेरी रेंडरर फोन:
for i in range(totalInstances):
p.apply_async(render, (allRenderArgs[i],args[2]), callback=renderFinished)
p.close()
यही खत्म ढंग से काम , पृष्ठभूमि में प्रक्रियाओं को लॉन्च करता है, और नए आदेशों की प्रतीक्षा करता है। मैं एक साधारण आदेश है कि ग्राहक को मारने और बंद हो जाएगा बनाया है प्रस्तुत करता है:
def close():
'close this client instance'
tn.write ("say "+USER+" is leaving the farm\r\n")
try:
p.terminate()
except Exception,e:
print str(e)
sys.exit()
sys.exit()
यह एक त्रुटि (यह त्रुटि मुद्रित होगा) देने के लिए नहीं लगता है, अजगर समाप्त लेकिन पृष्ठभूमि प्रक्रियाओं अभी भी कर रहे हैं चल रहा है। क्या कोई इन लॉन्च प्रोग्राम्स को नियंत्रित करने का बेहतर तरीका सुझा सकता है?
मल्टीप्रोसेसिंग आयात उपयोग से 'डीबग लॉगिंग को सक्षम करने का प्रयास करें; util.get_logger()। setLevel (util.DEBUG) 'और आउटपुट पेस्ट करें। – schlamar
मैंने इस तरह के व्यवहार को पहले देखा है लेकिन अब इसे पुन: पेश नहीं कर सकता ... मुझे आश्चर्य है कि p.join() को कॉल करने से p.terminate() को कॉल करने में मदद मिलेगी? मुझे यह भी आश्चर्य है कि आपको कॉलिनेट को कॉल करने की भी आवश्यकता है और यदि sys.exit() बस कर रहे हैं तो पूल और उसकी सभी प्रक्रियाओं को सही ढंग से कचरा इकट्ठा कर देगा। – mdscruggs
जब मैं लॉगिंग सक्षम करने का प्रयास करता हूं तो मुझे यह कंसोल में मिल रहा है: "लॉगर" मल्टीप्रोसेसिंग "के लिए कोई हैंडलर नहीं मिला। दुर्भाग्य से, p.join() p.terminate() के बाद कोई फर्क नहीं पड़ता है, और sys .exit() अजगर को बंद करता है लेकिन पृष्ठभूमि में चल रही प्रक्रियाओं को छोड़ देता है। – tk421storm