@@ -50,6 +50,7 @@ def __init__(self, id=-1, name=None):
5050 self ._wait_start = 0
5151 self ._start_time = 0
5252 self ._end_time = 0
53+ self ._timeout = float ('inf' )
5354 self ._retcode = multiprocessing .Value ('i' , 0 )
5455 self ._thread = None
5556 self ._worker_dir = None
@@ -130,6 +131,14 @@ def poll(self, wait=False):
130131 self ._wait_start = time .time ()
131132 logger .restart_message (self ._attempts )
132133 self ._retcode .value = - 1
134+ elif (time .time () - self ._start_time ) >= self ._timeout :
135+ self ._thread .terminate ()
136+ running = False
137+ logger = lg .FileLogger (self .logfile )
138+ logger .open (False )
139+ logger .error ('Worker runtime has exceeded the set maximum/timeout of {} seconds.' .format (self ._timeout ))
140+ logger .close ()
141+ self ._retcode .value = 906
133142
134143 return self .retcode if (not running or wait ) else None
135144
@@ -140,6 +149,7 @@ def terminate(self):
140149 logger .open (False )
141150 logger ._system_ ("Keyboard Interrupt (SIGINT) received. Terminating all Worker and exiting." )
142151 logger .close ()
152+ self ._retcode .value = 907
143153 return
144154
145155
@@ -414,6 +424,16 @@ def retry_wait_time(self, value):
414424 self ._retry_wait_time = int (value )
415425 return self
416426
427+ @property
428+ def timeout (self ):
429+ return getattr (self , '_timeout' , float ('inf' ))
430+ @timeout .setter
431+ def timeout (self , value ):
432+ if int (value ) < 1 :
433+ raise ValueError ('timeout must be greater than 0' )
434+ self ._timeout = int (value )
435+ return self
436+
417437 @property
418438 def parent_nodes (self ):
419439 return self ._parent_nodes
0 commit comments