Skip to content

Commit 6634e35

Browse files
authored
Merge pull request #8 from Comcast/feature-7
Added timeout property to Node to allow setting a maximum runtime for…
2 parents 2e6d2e2 + bdbdc84 commit 6634e35

File tree

4 files changed

+26
-2
lines changed

4 files changed

+26
-2
lines changed

pyrunner/core/node.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

pyrunner/core/register.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,5 +242,7 @@ def add_node(self, **kwargs):
242242
node.max_attempts = kwargs.get('max_attempts')
243243
if kwargs.get('retry_wait_time'):
244244
node.retry_wait_time = kwargs.get('retry_wait_time')
245+
if kwargs.get('timeout'):
246+
node.timeout = kwargs.get('timeout')
245247

246248
return self.add_node_object(node, kwargs.get('status', constants.STATUS_PENDING), kwargs.get('dependencies', ['PyRunnerRootNode']), kwargs.get('named_deps', True))

pyrunner/serde/json.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,5 +91,7 @@ def serialize(self, register):
9191
obj['tasks'][node.name]['retry_wait_time'] = node.retry_wait_time
9292
if node.arguments:
9393
obj['tasks'][node.name]['arguments'] = node.arguments
94+
if node.timeout != float('inf'):
95+
obj['tasks'][node.name]['timeout'] = node.timeout
9496

95-
return json.dumps(obj)
97+
return json.dumps(obj, indent=4)

pyrunner/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '4.3.0'
1+
__version__ = '4.4.0'

0 commit comments

Comments
 (0)