Skip to content

Commit ea0f451

Browse files
committed
Add timeout to task definition
1 parent 0274263 commit ea0f451

File tree

4 files changed

+32
-1
lines changed

4 files changed

+32
-1
lines changed

django_tasks/backends/database/backend.py

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ def _task_to_db_task(
4646
queue_name=task.queue_name,
4747
run_after=task.run_after,
4848
backend_name=self.alias,
49+
timeout=task.timeout,
4950
)
5051

5152
def enqueue(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Generated by Django 5.1.6 on 2025-02-16 16:53
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
dependencies = [
8+
("django_tasks_database", "0014_remove_dbtaskresult_exception_data"),
9+
]
10+
11+
operations = [
12+
migrations.AddField(
13+
model_name="dbtaskresult",
14+
name="timeout",
15+
field=models.PositiveBigIntegerField(default=600, verbose_name="timeout"),
16+
),
17+
]

django_tasks/backends/database/models.py

+3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from django_tasks.task import (
1616
DEFAULT_PRIORITY,
1717
DEFAULT_QUEUE_NAME,
18+
DEFAULT_TIMEOUT,
1819
MAX_PRIORITY,
1920
MIN_PRIORITY,
2021
ResultStatus,
@@ -99,6 +100,7 @@ class DBTaskResult(GenericBase[P, T], models.Model):
99100
backend_name = models.TextField(_("backend name"))
100101

101102
run_after = models.DateTimeField(_("run after"), null=True)
103+
timeout = models.PositiveBigIntegerField(_("timeout"), default=DEFAULT_TIMEOUT)
102104

103105
return_value = models.JSONField(_("return value"), default=None, null=True)
104106

@@ -141,6 +143,7 @@ def task(self) -> Task[P, T]:
141143
queue_name=self.queue_name,
142144
run_after=self.run_after,
143145
backend=self.backend_name,
146+
timeout=self.timeout,
144147
)
145148

146149
@property

django_tasks/task.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
MIN_PRIORITY = -100
3333
MAX_PRIORITY = 100
3434
DEFAULT_PRIORITY = 0
35+
DEFAULT_TIMEOUT = 600 # 10 minutes
3536

3637
TASK_REFRESH_ATTRS = {
3738
"_exception_class",
@@ -78,6 +79,9 @@ class Task(Generic[P, T]):
7879
immediately, or whatever the backend decides
7980
"""
8081

82+
timeout: int = DEFAULT_TIMEOUT
83+
"""The maximum duration the task can take to execute before being aborted"""
84+
8185
def __post_init__(self) -> None:
8286
self.get_backend().validate_task(self)
8387

@@ -95,6 +99,7 @@ def using(
9599
queue_name: Optional[str] = None,
96100
run_after: Optional[Union[datetime, timedelta]] = None,
97101
backend: Optional[str] = None,
102+
timeout: Optional[int] = None,
98103
) -> Self:
99104
"""
100105
Create a new task with modified defaults
@@ -110,6 +115,8 @@ def using(
110115
changes["run_after"] = run_after
111116
if backend is not None:
112117
changes["backend"] = backend
118+
if timeout is not None:
119+
changes["timeout"] = timeout
113120

114121
return replace(self, **changes)
115122

@@ -188,6 +195,7 @@ def task(
188195
queue_name: str = DEFAULT_QUEUE_NAME,
189196
backend: str = DEFAULT_TASK_BACKEND_ALIAS,
190197
enqueue_on_commit: Optional[bool] = None,
198+
timeout: int = DEFAULT_TIMEOUT,
191199
) -> Callable[[Callable[P, T]], Task[P, T]]: ...
192200

193201

@@ -199,6 +207,7 @@ def task(
199207
queue_name: str = DEFAULT_QUEUE_NAME,
200208
backend: str = DEFAULT_TASK_BACKEND_ALIAS,
201209
enqueue_on_commit: Optional[bool] = None,
210+
timeout: int = DEFAULT_TIMEOUT,
202211
) -> Union[Task[P, T], Callable[[Callable[P, T]], Task[P, T]]]:
203212
"""
204213
A decorator used to create a task.
@@ -212,6 +221,7 @@ def wrapper(f: Callable[P, T]) -> Task[P, T]:
212221
queue_name=queue_name,
213222
backend=backend,
214223
enqueue_on_commit=enqueue_on_commit,
224+
timeout=timeout,
215225
)
216226

217227
if function:
@@ -223,7 +233,7 @@ def wrapper(f: Callable[P, T]) -> Task[P, T]:
223233
@dataclass(frozen=True)
224234
class TaskResult(Generic[T]):
225235
task: Task
226-
"""The task for which this is a result"""
236+
"""The task for which this is a result, as it was run"""
227237

228238
id: str
229239
"""A unique identifier for the task result"""

0 commit comments

Comments
 (0)