#-*- coding: utf-8 -*-
'''Created on 2012-10-14 19:50
@summary: multiprocessing coordinate demo
@author: JerryKwan'''
from multiprocessing importEvent, Processimportsignalimporttime
SUBPROCESSES=[]
WORKERS=[]
EXIT=Event()defexit_handler(signum, frame):print "signal handler called with signal", signum, " ", WORKERS, " ", frame
EXIT.set()
time.sleep(1)for w inWORKERS:print "begin to invoke stop_main_loop"w.stop_main_loop()
signal.signal(signal.SIGTERM, exit_handler)
signal.signal(signal.SIGINT, exit_handler)classWorker(object):"""docstring for Worker"""
def __init__(self, arg = "default arg"):
super(Worker, self).__init__()
self.arg=arg
self.be_exit=Event()
self.be_exit.clear()defstop_main_loop(self):print "stop_main_loop invoked"self.be_exit.set()defmain_loop(self):print "main_loop invoked"
while notself.be_exit.is_set():print "do something"
try:
time.sleep(1)exceptException, e:print "exception occured,", eprint "exit from main_loop"
defdo_work(worker):print "do_work invoked"worker.main_loop()defcreate_subprocess():'''@summary: create subprocess
@return: (worker, process)'''w=Worker()
p= Process(target = do_work, args =(w,))
p.daemon=Truereturn(w, p)defmain():
process_num= 2
for i inxrange(process_num):
w, p=create_subprocess()
WORKERS.append(w)
SUBPROCESSES.append(p)#signal.signal(signal.SIGTERM, exit_handler)
#signal.signal(signal.SIGINT, exit_handler)
#start
for p inSUBPROCESSES:
p.start()#for p in SUBPROCESSES:
#p.join()
print "monitor subprocess"
while notEXIT.is_set():for i inxrange(len(SUBPROCESSES)):
p=SUBPROCESSES[i]if notp.is_alive():#create new process to replace the dead one
print "%d process is dead, so i will create a new one to relace it." %i
w, p=create_subprocess()
WORKERS[i]=w
SUBPROCESSES[i]=p
p.start()
time.sleep(1)print "main process exit"
#wait subprocess exit
#for i in xrange(process_num):
#while
if __name__ == '__main__':
main()