Django 处理 运行 个任务而不是 Celery
Django process running tasks instead of Celery
我是 运行 一个使用 Celery+redis 来处理异步任务的应用程序。
我设法让芹菜看到任务列表。但是,我的任务不是由 Celery worker 执行的,而是由 Django 进程执行的。
我尝试用 .delay()
和 .apply_async()
调用任务但没有成功(实际上在这些情况下,对任务的调用被无限期地阻止并且日志中没有显示任何内容)。
我可能遗漏了一些非常基本的东西,但看不到在哪里。
相关设置如下:
settings.py
CELERY_REDIS_DB = os.environ.get("REDIS_DB_CELERY", 0)
CELERY_REDIS_HOST = os.getenv("REDIS_HOSTNAME", "redis")
CELERY_REDIS_PORT = 6379
CELERY_RESULT_BACKEND = BROKER_URL = (
f'redis://{CELERY_REDIS_HOST}:{CELERY_REDIS_PORT}/{CELERY_REDIS_DB}'
)
CELERY_TIMEZONE = TIME_ZONE
CELERY_RESULT_EXPIRES = 5 * 60 * 60
celery.py
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'maat.settings')
app = Celery('maat')
# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
tasks.py
@shared_task
def remove_task(
environment=None,
payload=None,
**kwargs,
):
LOGGER.info('Received task, now removing')
...
views.py
class MyClass(
LoginRequiredMixin,
PermissionRequiredMixin,
SingleObjectMixin,
APIView
):
return_403 = True
model = models.Environment
slug_field = 'name'
slug_url_kwarg = 'environment'
def delete(self, request, environment):
tasks.remove_task(environment=environment, payload=request.data)
- Django 3.2
- 芹菜[redis] 5.1.2
- redis 3.5.3
- django-celery-结果 2.0.1
假设 celery.py
居住在 views.py
可以访问的地方,问题很可能是因为您正在使用共享任务,django 在没有更多信息的情况下不知道如何与 celery broker 通信.
为此,我们可以 follow the advice from our helpful friends at stack overflow 并在您看来执行类似以下操作:
from path.to.celery import app
app.set_default()
我是 运行 一个使用 Celery+redis 来处理异步任务的应用程序。 我设法让芹菜看到任务列表。但是,我的任务不是由 Celery worker 执行的,而是由 Django 进程执行的。
我尝试用 .delay()
和 .apply_async()
调用任务但没有成功(实际上在这些情况下,对任务的调用被无限期地阻止并且日志中没有显示任何内容)。
我可能遗漏了一些非常基本的东西,但看不到在哪里。
相关设置如下:
settings.py
CELERY_REDIS_DB = os.environ.get("REDIS_DB_CELERY", 0)
CELERY_REDIS_HOST = os.getenv("REDIS_HOSTNAME", "redis")
CELERY_REDIS_PORT = 6379
CELERY_RESULT_BACKEND = BROKER_URL = (
f'redis://{CELERY_REDIS_HOST}:{CELERY_REDIS_PORT}/{CELERY_REDIS_DB}'
)
CELERY_TIMEZONE = TIME_ZONE
CELERY_RESULT_EXPIRES = 5 * 60 * 60
celery.py
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'maat.settings')
app = Celery('maat')
# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
tasks.py
@shared_task
def remove_task(
environment=None,
payload=None,
**kwargs,
):
LOGGER.info('Received task, now removing')
...
views.py
class MyClass(
LoginRequiredMixin,
PermissionRequiredMixin,
SingleObjectMixin,
APIView
):
return_403 = True
model = models.Environment
slug_field = 'name'
slug_url_kwarg = 'environment'
def delete(self, request, environment):
tasks.remove_task(environment=environment, payload=request.data)
- Django 3.2
- 芹菜[redis] 5.1.2
- redis 3.5.3
- django-celery-结果 2.0.1
假设 celery.py
居住在 views.py
可以访问的地方,问题很可能是因为您正在使用共享任务,django 在没有更多信息的情况下不知道如何与 celery broker 通信.
为此,我们可以 follow the advice from our helpful friends at stack overflow 并在您看来执行类似以下操作:
from path.to.celery import app
app.set_default()