python - 使用 Celery 的 Django 没有执行我的任务
问题描述
在过去的 3 天里,我一直在尝试让 django 定期执行异步任务。遇到了Celery,它似乎与我的问题完美匹配,但我在网上阅读的越多,我准备的问题似乎就越多。无论如何,我能够模糊地将信息整合在一起,最终提出一个“有点解决方案”,因为有太多不推荐使用的模块和方法,很难从头到尾找到一个工作示例。因此,我正在尝试创建一个任务,该任务将定期创建某个模型对象(为了论证,假设为 30 秒)。所以我安装了redis作为“经纪人”,(所以我认为适合其他讨论)并设法设置我的任务并运行,但问题是即使它执行,也没有创建新模型,我怀疑这可能是本地和设置时区之间的配置错误,但坦率地说我不确定,据说它应该能够在管理面板中通过 django-celery-beat 表运行时创建新实例
my __init__.py:
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
__all__ = ('celery_app',)
celery.py in the base directory:
from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'firstApp.settings')
app = Celery('myProject')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
my settings.py configuration:
BROKER_URL = 'redis://localhost:6379'
CELERY_TIMEZONE = 'EUROPE/London'
CELERY_BEAT_SCHEDULE = {
'Every Minute' : {
'task' : 'main.tasks.Check_State_Up',
'schedule' : 30,
}
}
注意,'main' 是我的应用程序的名称
my tasks.py in main app:
from celery import shared_task
from django.shortcuts import get_object_or_404
import random
from .models import CheckUp, Company
@shared_task
def Check_State_Up():
parentInstance = get_object_or_404(ParentModel, symbol='Symbol')
def create(parent):
Widget.objects.create(parent=parent, randomValue=random.randint(100,250))
create(parentInstance)
注意,父模型具有名称和符号值
并且小部件有一个父级(外键)和一个随机值
让我们记住,这个函数在 shell 中调用时工作得很好,我只是为了演示而发布了它
谁能帮我理解这里出了什么问题?
还有我的芹菜日志
celery -A myProject beat -l Info
celery beat v5.0.5 (singularity) is starting.
__ - ... __ - _
LocalTime -> 2021-03-20 18:17:58
Configuration ->
. broker -> redis://localhost:6379//
. loader -> celery.loaders.app.AppLoader
. scheduler -> celery.beat.PersistentScheduler
. db -> celerybeat-schedule
. logfile -> [stderr]@%INFO
. maxinterval -> 5.00 minutes (300s)
[2021-03-20 18:17:58,033: INFO/MainProcess] beat: Starting...
它也停止并开始......
celery -A myProject worker -l 信息
-------------- celery@myDevice v5.0.5 (singularity)
--- ***** -----
-- ******* ---- Windows-10-10.0.18362-SP0 2021-03-20 18:17:50
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app: myProject:0x1502743f3d0
- ** ---------- .> transport: redis://localhost:6379//
- ** ---------- .> results: disabled://
- *** --- * --- .> concurrency: 4 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery
[tasks]
. myProject.celery.debug_task
. main.tasks.Check_State_Up
[2021-03-20 18:17:51,102: INFO/MainProcess] Connected to redis://localhost:6379//
[2021-03-20 18:17:51,130: INFO/MainProcess] mingle: searching for neighbors
[2021-03-20 18:17:51,904: INFO/SpawnPoolWorker-1] child process 1852 calling self.run()
[2021-03-20 18:17:51,922: INFO/SpawnPoolWorker-3] child process 8424 calling self.run()
[2021-03-20 18:17:51,955: INFO/SpawnPoolWorker-2] child process 8600 calling self.run()
[2021-03-20 18:17:52,002: INFO/SpawnPoolWorker-4] child process 14840 calling self.run()
笔记
调用 self.run() 的子进程 1000 仅在从管理面板手动启动时执行,而不是在启动时执行。我希望这足以理解。谢谢你。
还:
Django==3.1.7
django-celery-beat==2.2.0
celery==5.0.5
redis==3.5.3
解决方案
推荐阅读
- python - 如何避免 Python 挂在 subprocess.run()
- python-3.x - 参数必须是字符串或数字问题,而不是“类型”-Pyspark
- php - CRM 使用 PHP CURL 显示数据
- php - 如何在同一页面上的路由/控制器中使用更多引导模型进行操作(Laravel)
- javascript - 如何取消选择除不应在 echarts 中取消选择的另一个图例之外的所有图例
- enums - 为 Vaadin 14 Web 应用程序中的枚举支持的单选按钮生成标签
- javascript - d3 图表在 X 轴刻度中显示一些十进制值,而不是显示日期和时间
- powershell - 通过提供 fullName 和 manager 全名获取 AD 用户
- sql - 那么如何通过计算在表格上添加一列
- types - 在类型文件中用空格声明函数