@@ -43,19 +43,22 @@ def __init__(self, id=-1, name=None):
4343 self .name = name
4444
4545 self ._id = int (id )
46+
47+ # Num attempts/restart management
4648 self ._attempts = 0
4749 self ._max_attempts = 1
4850 self ._retry_wait_time = 0
4951 self ._wait_until = 0
52+
5053 self ._start_time = 0
5154 self ._end_time = 0
5255 self ._timeout = float ('inf' )
53- self ._retcode = 0
54- self ._proc_retcode = None
5556 self ._proc = None
5657 self ._context = None
58+
5759 self ._module = None
5860 self ._worker = None
61+ self ._worker_instance = None
5962
6063 self ._parent_nodes = set ()
6164 self ._child_nodes = set ()
@@ -71,6 +74,9 @@ def __ne__(self, other):
7174 def __lt__ (self , other ):
7275 return self ._id < other ._id
7376
77+ def is_runnable (self ):
78+ return time .time () >= self ._wait_until
79+
7480 def execute (self ):
7581 """
7682 Spawns a new process via the `run` method of defined Worker class.
@@ -82,29 +88,22 @@ def execute(self):
8288 logfile handle, and task-level arguments.
8389 """
8490 # Return early if retry triggered and wait time has not yet fully elapsed
85- if time . time () < self ._wait_until :
91+ if not self .is_runnable () :
8692 return
8793
88- self ._proc_retcode = multiprocessing .Value ('i' , 0 )
89- self ._proc_retcode .value = 0
9094 self ._attempts += 1
9195
9296 if not self ._start_time :
9397 self ._start_time = time .time ()
9498
9599 try :
96- worker_class = getattr (importlib .import_module (self .module ), self .worker )
97-
98100 # Check if provided worker actually extends the Worker class.
99- if issubclass (worker_class , Worker ):
100- worker = worker_class (self .context , self ._proc_retcode , self .logfile , self .argv )
101- # If it does not extend the Worker class, initialize a reverse-Worker in which the
102- # worker extends the provided class.
103- else :
101+ if not issubclass (self .worker_class , Worker ):
104102 raise TypeError ('{}.{} is not an extension of pyrunner.Worker' .format (self .module , self .worker ))
105103
106104 # Launch the "run" method of the provided Worker under a new process.
107- self ._proc = multiprocessing .Process (target = worker .protected_run , daemon = False )
105+ self ._worker_instance = self .worker_class (self .context , self .logfile , self .argv )
106+ self ._proc = multiprocessing .Process (target = self ._worker_instance .protected_run , daemon = False )
108107 self ._proc .start ()
109108 except Exception as e :
110109 logger = lg .FileLogger (self .logfile )
@@ -127,25 +126,24 @@ def poll(self, wait=False):
127126 Integer return code if process has exited, otherwise `None`.
128127 """
129128 if not self ._proc :
130- self .retcode = 905
131- return self .retcode
129+ return 905
132130
133131 running = self ._proc .is_alive ()
132+ retcode = 0
134133
135134 if not running or wait :
136135 # Note that if wait is True, then the join() method is invoked immediately,
137136 # causing the thread to block until it's job is complete.
138137 self ._proc .join ()
139138 self ._end_time = time .time ()
140- self . retcode = self ._proc_retcode . value
141- if self . retcode > 0 and (self ._attempts < self .max_attempts ):
139+ retcode = self ._worker_instance . retcode
140+ if retcode > 0 and (self ._attempts < self .max_attempts ):
142141 logger = lg .FileLogger (self .logfile )
143142 logger .open (False )
144- logger .info ('Waiting {} seconds before retrying...' .format (self ._retry_wait_time ))
145143 self ._wait_until = time .time () + self ._retry_wait_time
146- logger .restart_message (self ._attempts )
147- logger .close ()
148- self . retcode = - 1
144+ logger .restart_message (self ._attempts , 'Waiting {} seconds before retrying...' . format ( self . _retry_wait_time ) )
145+ logger .close (False )
146+ retcode = - 1
149147 self .cleanup ()
150148 elif (time .time () - self ._start_time ) >= self ._timeout :
151149 self ._proc .terminate ()
@@ -155,9 +153,9 @@ def poll(self, wait=False):
155153 logger .error ('Worker runtime has exceeded the set maximum/timeout of {} seconds.' .format (self ._timeout ))
156154 logger .close ()
157155 self .cleanup ()
158- self . retcode = 906
156+ retcode = 906
159157
160- return self . retcode if (not running or wait ) else None
158+ return retcode if (not running or wait ) else None
161159
162160 def terminate (self ):
163161 """
@@ -167,15 +165,13 @@ def terminate(self):
167165 self ._proc .terminate ()
168166 logger = lg .FileLogger (self .logfile )
169167 logger .open (False )
170- logger ._system_ ("Keyboard Interrupt (SIGINT) received. Terminating all Worker and exiting." )
168+ logger ._system_ ("Keyboard Interrupt (SIGINT) received. Terminating Worker and exiting." )
171169 logger .close ()
172- self .retcode = 907
173170 self .cleanup ()
174- return
171+ return 907
175172
176173 def cleanup (self ):
177174 self ._proc = None
178- self ._proc_retcode = None
179175 self ._context = None
180176
181177
@@ -264,16 +260,6 @@ def name(self, value):
264260 self ._name = str (value ).strip ()
265261 return self
266262
267- @property
268- def retcode (self ):
269- return self ._retcode
270- @retcode .setter
271- def retcode (self , value ):
272- if int (value ) < - 2 :
273- raise ValueError ('retcode must be -2 or greater - received: {}' .format (value ))
274- self ._retcode = int (value )
275- return self
276-
277263 @property
278264 def context (self ):
279265 return getattr (self , '_context' , None )
0 commit comments