मैं एकाधिक प्रक्रियाओं का उपयोग करके एक प्रोग्राम बनाने का प्रयास कर रहा हूं और त्रुटियों के दौरान मैं सभी तैयार प्रक्रियाओं को साफ़ करना चाहता हूं। नीचे मैंने कुछ छद्म प्रकार कोड लिखा है जो मुझे लगता है कि मुझे क्या करना है, लेकिन मुझे नहीं पता कि सभी प्रक्रियाओं के साथ संवाद करने का सबसे अच्छा तरीका क्या है कि एक त्रुटि हुई है और उन्हें समाप्त करना चाहिए।क्लीन पायथन मल्टीप्रोसेस समाप्ति एक निकास ध्वज पर निर्भर
मुझे लगता है कि मुझे इस तरह की चीज़ों के लिए कक्षाओं का उपयोग करना चाहिए, लेकिन मैं पाइथन के लिए काफी नया हूं इसलिए मैं बस मूल बातें के आसपास अपना सिर लेने की कोशिश कर रहा हूं।
import multiprocessing
import threading
import time
def good_worker():
print "[GoodWorker] Starting"
time.sleep(4)
print "[GoodWorker] all good"
def bad_worker():
print "[BadWorker] Starting"
time.sleep(2)
raise Exception("ups!")
class MyProcManager(object):
def __init__(self):
self.procs = []
self.errors_flag = False
self._threads = []
self._lock = threading.Lock()
def terminate_all(self):
with self._lock:
for p in self.procs:
if p.is_alive():
print "Terminating %s" % p
p.terminate()
def launch_proc(self, func, args=(), kwargs= {}):
t = threading.Thread(target=self._proc_thread_runner,
args=(func, args, kwargs))
self._threads.append(t)
t.start()
def _proc_thread_runner(self, func, args, kwargs):
p = multiprocessing.Process(target=func, args=args, kwargs=kwargs)
self.procs.append(p)
p.start()
while p.exitcode is None:
p.join()
if p.exitcode > 0:
self.errors_flag = True
self.terminate_all()
def wait(self):
for t in self._threads:
t.join()
if __name__ == '__main__':
proc_manager = MyProcManager()
proc_manager.launch_proc(good_worker)
proc_manager.launch_proc(good_worker)
proc_manager.launch_proc(bad_worker)
proc_manager.wait()
if proc_manager.errors_flag:
print "Errors flag is set: some process crashed"
else:
print "Everything closed cleanly"
आप प्रत्येक प्रक्रिया चलाने के लिए एक आवरण धागा, जिसकी समाप्ति के लिए इंतजार कर रहा है की आवश्यकता है:
#imports
exitFlag = True
# Function for threads to process
def url_thread_worker():
# while exitFlag:
try:
# do something
except:
# we've ran into a problem, we need to kill all the spawned processes and cleanly exit the program
exitFlag = False
def processStarter():
process_1 = multiprocessing.Process(name="Process-1", target=url_thread_worker, args=())
process_2 = multiprocessing.Process(name="Process-2", target=url_thread_worker, args=())
process_1.start()
process_2.start()
if __name__ == '__main__':
processStarter()
अग्रिम
यह एक अच्छा उदाहरण है और इससे बहुत मदद मिली है। आपका बहुत बहुत धन्यवाद। –
आपने "आसान हिस्सा" को संभालने का फैसला किया - जब बच्चे मर जाते हैं। लेकिन अगर माता-पिता मर जाए तो क्या होगा? अनाथ प्रक्रियाओं (श्रमिकों) के साथ आपको छोड़ दिया जाएगा। जो, कम से कम मेरे लिए, एक बड़ी समस्या है। –
यह हल करने के लिए एक बहुत ही अलग मामला है और वास्तव में आम नहीं है, IMHO। आपको यह सुनिश्चित करने के लिए अपने सिस्टम को कोड करना चाहिए कि माता-पिता त्रुटियों के प्रति लचीला है और कम से कम, कुछ समस्या होने पर, बच्चे प्रक्रियाओं को समाप्त कर सकते हैं। – abranches