Bases: DecoratorNode
The timeout decorator ticks its child and starts a timer. The next time
it receives a tick it will check its timer against the time limit. If
the elapsed time exceeds the limit, this node returns FAILURE.
This is primarily useful for nodes that are executing asynchronously.
Parameters:
| Name |
Type |
Description |
Default |
name
|
`str`
|
The given name of this node.
|
required
|
child
|
`dendron.tree_node.TreeNode`
|
|
required
|
timelimit
|
`int`
|
The integer number of milliseconds to wait before returning
failure.
|
required
|
Source code in src/dendron/decorators/timeout.py
| class Timeout(DecoratorNode):
"""
The timeout decorator ticks its child and starts a timer. The next time
it receives a tick it will check its timer against the time limit. If
the elapsed time exceeds the limit, this node returns `FAILURE`.
This is primarily useful for nodes that are executing asynchronously.
Args:
name (`str`):
The given name of this node.
child (`dendron.tree_node.TreeNode`):
The child of this node.
timelimit (`int`):
The integer number of *milliseconds* to wait before returning
failure.
"""
def __init__(self, name: str, child: TreeNode, timelimit: int) -> None:
super().__init__(name, child)
self.timelimit = timelimit
self.timer_started = False
self.start_time = 0 # this is an int in millis.
def reset(self) -> None:
"""
Reset the timer and instruct the child node to reset.
"""
self.timer_started = False
self.start_time = 0
self.reset_child()
def tick(self) -> NodeStatus:
"""
Tick the child node, but with a time limit. If the time limit
is exceeded, return `FAILURE`.
"""
if not self.timer_started:
self.timer_started = True
self.set_status(NodeStatus.RUNNING)
self.start_time = time.time_ns()
child_status = self.child_node.execute_tick()
elapsed_ms = (time.time_ns() - self.start_time)/1e6
if elapsed_ms > self.timelimit:
return NodeStatus.FAILURE
else:
return child_status
|
reset()
Reset the timer and instruct the child node to reset.
Source code in src/dendron/decorators/timeout.py
| def reset(self) -> None:
"""
Reset the timer and instruct the child node to reset.
"""
self.timer_started = False
self.start_time = 0
self.reset_child()
|
tick()
Tick the child node, but with a time limit. If the time limit
is exceeded, return FAILURE.
Source code in src/dendron/decorators/timeout.py
| def tick(self) -> NodeStatus:
"""
Tick the child node, but with a time limit. If the time limit
is exceeded, return `FAILURE`.
"""
if not self.timer_started:
self.timer_started = True
self.set_status(NodeStatus.RUNNING)
self.start_time = time.time_ns()
child_status = self.child_node.execute_tick()
elapsed_ms = (time.time_ns() - self.start_time)/1e6
if elapsed_ms > self.timelimit:
return NodeStatus.FAILURE
else:
return child_status
|