<@ULVA73B9P> Using Prefect 3, I have tasks that ca...
# marvin-in-the-wild
t
@Marvin Using Prefect 3, I have tasks that can run indefinitely in some cases, I'd like to kill them using the timeout_seconds parameter but it seems to only mark the task as
TimedOut
but not kill the task, is there a clean way to do so ?
m
In Prefect 3.x, the
timeout_seconds
parameter indeed marks the task as
TimedOut
but does not terminate the task's underlying process. This can lead to processes that remain running even after being marked as timed out. To cleanly terminate tasks after a timeout, you might have to implement additional logic within the task itself to monitor its execution time and terminate if it exceeds a certain duration. Alternatively, using external watchdog processes or configuring resource constraints at the infrastructure level (e.g., using Kubernetes or Docker) can achieve the same result. Here is a brief example of how you could handle task timeouts within the task itself using Python's signal module:
Copy code
python
import signal
import time
from prefect import flow, task

# Custom exception for timeout
class TimeoutException(Exception):
    pass

def timeout_handler(signum, frame):
    raise TimeoutException("Task exceeded allowed timeout")

@task
def my_long_running_task(timeout=10):
    signal.signal(signal.SIGALRM, timeout_handler)
    signal.alarm(timeout)
    
    try:
        # Simulate a long-running task
        time.sleep(20)
    except TimeoutException:
        print("Task was timed out and terminated")
    finally:
        signal.alarm(0)  # Disable the alarm

@flow
def my_flow():
    my_long_running_task()

if __name__ == "__main__":
    my_flow()
In this example, if
my_long_running_task
exceeds the specified 10-second timeout, it raises an exception and terminates the task. The
signal.alarm(0)
is used to disable the alarm after the task completes or is terminated. For more details on Prefect task configurations and behaviour, you can refer to the official documentation here: Prefect 3.x Task Timeouts This approach ensures that the task is both marked as timed out and its execution is halted, providing a cleaner way to manage long-running tasks in Prefect 3.