#!/opt/IBpython/3.1.1/bin/python3 #!/opt/IB/python/2.6.3/bin/python from multiprocessing import Process, Pipe, Queue import threading import time import copy class failureObject(): def __init__(self, ignoreFailure=False): self.__failure = False self.__failureString = "" # self.__lock = threading.Lock() self.__ignoreFailure = ignoreFailure def setFailure(self, failString): if not self.__ignoreFailure: # self.__lock.acquire() self.__failure = True self.__failureString = failString # self.__lock.release() def hasFailed(self): return self.__failure def status(self): if not self.__failure: return True else: return self.__failureString def main(): q = Queue() while True: fail=failureObject() tlist = [] for x in ["data1", "data2"]: t = threading.Thread(target=checkAlive, args = (fail, x), name=x) t.start() tlist.append(t) for x in tlist: t.join() print(fail.status()) def subProc(targetfunc, args, timeout=60): newJob = Process(target=targetfunc) newJob.daemon=False newJob.start() print("Started subproc: PID: %d : args: %s" %(newJob.pid, str(args))) startTime = int(time.time()) childResult = None while startTime + timeout > int(time.time()): print("poll") print("isalive: " + str(newJob.is_alive())) if not newJob.is_alive(): print("Reaping PID: " + str(newJob.pid)) newJob.join() break time.sleep(1) # Ok, something went wrong, its still alive, and we've passed timeout if newJob.is_alive(): print("terminating") newJob.terminate() newJob.join(3) if newJob.is_alive(): # die die die!! print("Sending sigkill to PID: " + str(newJob.pid)) newJob.kill() print("Child had to be killed due to a timeout") return "Module Timeout" newJob.join(3) return "Func Exit" def checkAlive(fail, data): res = subProc(returnTrue, data) def returnTrue(): # myPipe.send(True) return True if __name__ == "__main__": main()