django-lambda-tasks 0.6.2__tar.gz → 0.6.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/PKG-INFO +1 -1
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/lambda_tasks/local_executor.py +20 -1
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/pyproject.toml +1 -1
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/test_local_executor.py +19 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.github/workflows/ci.yml +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.github/workflows/release.yml +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.gitignore +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/async-local-execution/.config.kiro +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/async-local-execution/design.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/async-local-execution/requirements.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/async-local-execution/tasks.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/deferred-task-enqueue/.config.kiro +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/deferred-task-enqueue/design.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/deferred-task-enqueue/requirements.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/deferred-task-enqueue/tasks.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/eager-mode-example-app/.config.kiro +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/eager-mode-example-app/design.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/eager-mode-example-app/requirements.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/eager-mode-example-app/tasks.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/ignore-errors-decorator-option/.config.kiro +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/ignore-errors-decorator-option/design.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/ignore-errors-decorator-option/requirements.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/ignore-errors-decorator-option/tasks.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/import-string-task-resolution/.config.kiro +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/import-string-task-resolution/design.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/import-string-task-resolution/requirements.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/import-string-task-resolution/tasks.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/retry-delay/.config.kiro +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/retry-delay/design.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/retry-delay/requirements.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/retry-delay/tasks.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/rse-background-tasks/.config.kiro +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/rse-background-tasks/design.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/rse-background-tasks/requirements.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/rse-background-tasks/tasks.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/rse-background-tasks-bugfix/.config.kiro +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/rse-background-tasks-bugfix/bugfix.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/rse-background-tasks-bugfix/design.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/rse-background-tasks-bugfix/tasks.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/singleton-task/.config.kiro +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/singleton-task/design.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/singleton-task/requirements.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/singleton-task/tasks.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/ssm-environment-loader/.config.kiro +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/ssm-environment-loader/design.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/ssm-environment-loader/requirements.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/ssm-environment-loader/tasks.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/task-retry/.config.kiro +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/task-retry/design.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/task-retry/requirements.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/task-retry/tasks.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/steering/product.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/steering/structure.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/steering/tech.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.pre-commit-config.yaml +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.vscode/settings.json +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/README.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/example/README.md +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/example/example_app/__init__.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/example/example_app/apps.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/example/example_app/tasks.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/example/example_app/urls.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/example/example_app/views.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/example/example_project/__init__.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/example/example_project/settings.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/example/example_project/urls.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/example/example_project/wsgi.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/example/manage.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/lambda_tasks/__init__.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/lambda_tasks/admin.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/lambda_tasks/apps.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/lambda_tasks/decorators.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/lambda_tasks/environment_loader.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/lambda_tasks/handler.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/lambda_tasks/logging.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/lambda_tasks/migrations/0001_initial.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/lambda_tasks/migrations/0002_alter_taskrecord_status.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/lambda_tasks/migrations/__init__.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/lambda_tasks/models.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/lambda_tasks/secret_loader.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/lambda_tasks/settings.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/lambda_tasks/tasks.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/lambda_tasks/timeouts.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/conftest.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/settings.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/test_admin.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/test_batch.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/test_batch_worker.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/test_decorator.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/test_decorators.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/test_deferred_enqueue.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/test_environment_loader.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/test_handler.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/test_kwargs_only.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/test_logging.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/test_memory_limit.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/test_models.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/test_secret_loader.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/test_serializer.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/test_settings.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/test_tasks.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/test_timeout_validation.py +0 -0
- {django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/tests/test_timeouts.py +0 -0
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import atexit
|
|
4
4
|
import logging
|
|
5
|
+
import multiprocessing
|
|
5
6
|
import signal
|
|
6
7
|
import threading
|
|
7
8
|
import uuid
|
|
@@ -23,14 +24,22 @@ def _pool_initializer() -> None:
|
|
|
23
24
|
atexit as a fallback). This prevents workers from being killed
|
|
24
25
|
mid-operation and leaking semaphores.
|
|
25
26
|
|
|
27
|
+
Closes all database connections before setting up Django. With the
|
|
28
|
+
forkserver context, workers don't inherit the parent's connections,
|
|
29
|
+
but AppConfig.ready() hooks may open connections during django.setup()
|
|
30
|
+
that should be closed before task execution begins.
|
|
31
|
+
|
|
26
32
|
Then sets up Django for task execution.
|
|
27
33
|
"""
|
|
28
34
|
signal.signal(signal.SIGINT, signal.SIG_IGN)
|
|
29
35
|
|
|
30
36
|
import django
|
|
37
|
+
from django.db import connections
|
|
31
38
|
|
|
32
39
|
django.setup()
|
|
33
40
|
|
|
41
|
+
connections.close_all()
|
|
42
|
+
|
|
34
43
|
|
|
35
44
|
def _shutdown_pool() -> None:
|
|
36
45
|
"""Shut down the pool, releasing its POSIX semaphores promptly.
|
|
@@ -111,12 +120,22 @@ def _install_shutdown_handlers() -> None:
|
|
|
111
120
|
|
|
112
121
|
|
|
113
122
|
def get_pool() -> ProcessPoolExecutor:
|
|
114
|
-
"""Return the shared ProcessPoolExecutor, creating it on first call.
|
|
123
|
+
"""Return the shared ProcessPoolExecutor, creating it on first call.
|
|
124
|
+
|
|
125
|
+
Uses the "forkserver" multiprocessing context so that worker processes
|
|
126
|
+
are forked from a clean server process rather than from the Django parent.
|
|
127
|
+
This prevents workers from inheriting the parent's open database
|
|
128
|
+
connections (and other file descriptors), which would otherwise cause
|
|
129
|
+
"server closed the connection unexpectedly" errors in containerized
|
|
130
|
+
environments where close() in the child tears down the shared socket.
|
|
131
|
+
"""
|
|
115
132
|
global _pool
|
|
116
133
|
if _pool is None:
|
|
117
134
|
conf = LambdaTasksSettings()
|
|
135
|
+
mp_context = multiprocessing.get_context("forkserver")
|
|
118
136
|
_pool = ProcessPoolExecutor(
|
|
119
137
|
max_workers=conf.LOCAL_WORKERS,
|
|
138
|
+
mp_context=mp_context,
|
|
120
139
|
initializer=_pool_initializer,
|
|
121
140
|
)
|
|
122
141
|
atexit.register(_shutdown_pool)
|
|
@@ -189,6 +189,25 @@ class TestGetPool:
|
|
|
189
189
|
|
|
190
190
|
assert lambda_tasks.local_executor._pool is pool
|
|
191
191
|
|
|
192
|
+
@pytest.mark.usefixtures("_reset_pool")
|
|
193
|
+
def test_get_pool_uses_forkserver_context(self, settings):
|
|
194
|
+
"""get_pool() uses the forkserver multiprocessing context.
|
|
195
|
+
|
|
196
|
+
This prevents workers from inheriting the parent's open database
|
|
197
|
+
connections, which would cause connection errors in containerized
|
|
198
|
+
environments.
|
|
199
|
+
"""
|
|
200
|
+
import lambda_tasks.local_executor
|
|
201
|
+
|
|
202
|
+
settings.LAMBDA_TASKS_LOCAL_WORKERS = 2
|
|
203
|
+
settings.LAMBDA_TASKS_EAGER = False
|
|
204
|
+
|
|
205
|
+
pool = lambda_tasks.local_executor.get_pool()
|
|
206
|
+
|
|
207
|
+
# ProcessPoolExecutor stores the context; forkserver processes
|
|
208
|
+
# use the ForkServerProcess type
|
|
209
|
+
assert pool._mp_context.get_start_method() == "forkserver"
|
|
210
|
+
|
|
192
211
|
|
|
193
212
|
# ---------------------------------------------------------------------------
|
|
194
213
|
# Property-based tests: get_pool() (Requirement 2)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/async-local-execution/design.md
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/async-local-execution/tasks.md
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/deferred-task-enqueue/design.md
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/deferred-task-enqueue/tasks.md
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/eager-mode-example-app/design.md
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/eager-mode-example-app/tasks.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/retry-delay/.config.kiro
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/retry-delay/requirements.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/rse-background-tasks/design.md
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/rse-background-tasks/tasks.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/singleton-task/.config.kiro
RENAMED
|
File without changes
|
{django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/singleton-task/design.md
RENAMED
|
File without changes
|
{django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/singleton-task/requirements.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/ssm-environment-loader/design.md
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/ssm-environment-loader/tasks.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/.kiro/specs/task-retry/requirements.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.2 → django_lambda_tasks-0.6.4}/lambda_tasks/migrations/0001_initial.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|