django-lambda-tasks 0.6.3__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.3 → django_lambda_tasks-0.6.4}/PKG-INFO +1 -1
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/lambda_tasks/local_executor.py +18 -6
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/pyproject.toml +1 -1
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/test_local_executor.py +19 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.github/workflows/ci.yml +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.github/workflows/release.yml +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.gitignore +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/async-local-execution/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/async-local-execution/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/async-local-execution/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/async-local-execution/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/deferred-task-enqueue/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/deferred-task-enqueue/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/deferred-task-enqueue/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/deferred-task-enqueue/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/eager-mode-example-app/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/eager-mode-example-app/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/eager-mode-example-app/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/eager-mode-example-app/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/ignore-errors-decorator-option/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/ignore-errors-decorator-option/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/ignore-errors-decorator-option/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/ignore-errors-decorator-option/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/import-string-task-resolution/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/import-string-task-resolution/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/import-string-task-resolution/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/import-string-task-resolution/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/retry-delay/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/retry-delay/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/retry-delay/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/retry-delay/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/rse-background-tasks/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/rse-background-tasks/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/rse-background-tasks/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/rse-background-tasks/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/rse-background-tasks-bugfix/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/rse-background-tasks-bugfix/bugfix.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/rse-background-tasks-bugfix/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/rse-background-tasks-bugfix/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/singleton-task/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/singleton-task/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/singleton-task/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/singleton-task/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/ssm-environment-loader/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/ssm-environment-loader/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/ssm-environment-loader/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/ssm-environment-loader/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/task-retry/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/task-retry/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/task-retry/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/task-retry/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/steering/product.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/steering/structure.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/steering/tech.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.pre-commit-config.yaml +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.vscode/settings.json +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/README.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/example/README.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/example/example_app/__init__.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/example/example_app/apps.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/example/example_app/tasks.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/example/example_app/urls.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/example/example_app/views.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/example/example_project/__init__.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/example/example_project/settings.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/example/example_project/urls.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/example/example_project/wsgi.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/example/manage.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/lambda_tasks/__init__.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/lambda_tasks/admin.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/lambda_tasks/apps.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/lambda_tasks/decorators.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/lambda_tasks/environment_loader.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/lambda_tasks/handler.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/lambda_tasks/logging.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/lambda_tasks/migrations/0001_initial.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/lambda_tasks/migrations/0002_alter_taskrecord_status.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/lambda_tasks/migrations/__init__.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/lambda_tasks/models.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/lambda_tasks/secret_loader.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/lambda_tasks/settings.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/lambda_tasks/tasks.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/lambda_tasks/timeouts.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/conftest.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/settings.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/test_admin.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/test_batch.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/test_batch_worker.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/test_decorator.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/test_decorators.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/test_deferred_enqueue.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/test_environment_loader.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/test_handler.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/test_kwargs_only.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/test_logging.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/test_memory_limit.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/test_models.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/test_secret_loader.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/test_serializer.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/test_settings.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/test_tasks.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/tests/test_timeout_validation.py +0 -0
- {django_lambda_tasks-0.6.3 → 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,9 +24,10 @@ 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
|
|
|
26
|
-
Closes all
|
|
27
|
-
|
|
28
|
-
|
|
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.
|
|
29
31
|
|
|
30
32
|
Then sets up Django for task execution.
|
|
31
33
|
"""
|
|
@@ -34,10 +36,10 @@ def _pool_initializer() -> None:
|
|
|
34
36
|
import django
|
|
35
37
|
from django.db import connections
|
|
36
38
|
|
|
37
|
-
connections.close_all()
|
|
38
|
-
|
|
39
39
|
django.setup()
|
|
40
40
|
|
|
41
|
+
connections.close_all()
|
|
42
|
+
|
|
41
43
|
|
|
42
44
|
def _shutdown_pool() -> None:
|
|
43
45
|
"""Shut down the pool, releasing its POSIX semaphores promptly.
|
|
@@ -118,12 +120,22 @@ def _install_shutdown_handlers() -> None:
|
|
|
118
120
|
|
|
119
121
|
|
|
120
122
|
def get_pool() -> ProcessPoolExecutor:
|
|
121
|
-
"""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
|
+
"""
|
|
122
132
|
global _pool
|
|
123
133
|
if _pool is None:
|
|
124
134
|
conf = LambdaTasksSettings()
|
|
135
|
+
mp_context = multiprocessing.get_context("forkserver")
|
|
125
136
|
_pool = ProcessPoolExecutor(
|
|
126
137
|
max_workers=conf.LOCAL_WORKERS,
|
|
138
|
+
mp_context=mp_context,
|
|
127
139
|
initializer=_pool_initializer,
|
|
128
140
|
)
|
|
129
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.3 → 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.3 → 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.3 → 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.3 → 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.3 → 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.3 → 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.3 → django_lambda_tasks-0.6.4}/.kiro/specs/retry-delay/.config.kiro
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.3 → 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.3 → 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.3 → 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.3 → django_lambda_tasks-0.6.4}/.kiro/specs/singleton-task/.config.kiro
RENAMED
|
File without changes
|
{django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.4}/.kiro/specs/singleton-task/design.md
RENAMED
|
File without changes
|
{django_lambda_tasks-0.6.3 → 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.3 → 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.3 → 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.3 → 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.3 → 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
|