I am trying to exit a multiprocessing script when an error is thrown by the target function, but instead of quitting, the parent process just hangs.
This is the test script I use to replicate the problem:
#!/usr/bin/python3.5
import time, multiprocessing as mp
def myWait(wait, resultQueue):
startedAt = time.strftime("%H:%M:%S", time.localtime())
time.sleep(wait)
endedAt = time.strftime("%H:%M:%S", time.localtime())
name = mp.current_process().name
resultQueue.put((name, wait, startedAt, endedAt))
# queue initialisation
resultQueue = mp.Queue()
# process creation arg: (process number, sleep time, queue)
proc = [
mp.Process(target=myWait, name = ' _One_', args=(2, resultQueue,)),
mp.Process(target=myWait, name = ' _Two_', args=(2, resultQueue,))
]
# starting processes
for p in proc:
p.start()
for p in proc:
p.join()
# print results
results = {}
for p in proc:
name, wait, startedAt, endedAt = resultQueue.get()
print('Process %s started at %s wait %s ended at %s' % (name, startedAt, wait, endedAt))
This works perfectly, I can see the parent script spawning two child processes in htop but when I want to force the parent script to exit if an error is thrown in the myWait target function the parent process just hangs and doesn't even spawn any child process. I have to ctrl-c to kill it.
def myWait(wait, resultQueue):
try:
# do something wrong
except:
raise SystemExit
I have tried every way to exit the function (e.g. exit(), sys.exit(), os._exit()...) to no avail.