in azure/durable_functions/models/TaskOrchestrationExecutor.py [0:0]
def resume_user_code(self):
"""Attempt to continue executing user code.
We can only continue executing if the active/current task has resolved to a value.
"""
current_task = self.current_task
self.context._set_is_replaying(current_task.is_played)
if current_task.state is TaskState.RUNNING:
# if the current task hasn't been resolved, we can't
# continue executing the user code.
return
new_task = None
try:
# resume orchestration with a resolved task's value
task_value = current_task.result
task_succeeded = current_task.state is TaskState.SUCCEEDED
new_task = self.generator.send(
task_value) if task_succeeded else self.generator.throw(task_value)
if isinstance(new_task, TaskBase) and not (new_task._is_scheduled):
self.context._add_to_open_tasks(new_task)
except StopIteration as stop_exception:
# the orchestration returned,
# flag it as such and capture its output
self.orchestrator_returned = True
self.output = stop_exception.value
except Exception as exception:
# the orchestration threw an exception
self.exception = exception
self.current_task = new_task
if not (new_task is None):
if not (self.current_task._is_scheduled):
# new task is received. it needs to be resolved to a value
self.context._add_to_actions(self.current_task.action_repr)
self._mark_as_scheduled(self.current_task)
if not (new_task.state is TaskState.RUNNING):
# user yielded the same task multiple times, continue executing code
# until a new/not-previously-yielded task is encountered
self.resume_user_code()