报错截图
这些是我的搜索记录,错误太多了所以没截图,遇到一个搜一个
解决方法
最重要最关键的在第6点!!!
有的问题也不知道是做到哪一步了才成功解决了的,这里把关键部分的代码和截图奉上:
1.settings.py
# celery的配置
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_TASK_TRACK_STARTED = True
# 任务执行超时时间(30分钟)
CELERY_TASK_TIME_LIMIT = 30 * 60
# 配置任务消息中间件
CELERY_BROKER_URL = 'redis://localhost:6379/1'
# 指定 Backend
CELERY_RESULT_BACKEND = 'redis://localhost:6379/2'
CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True
CELERY_FORCE_EXECV = True
# celery 序列化与反序列化配置
CELERY_TASK_SERIALIZER = 'pickle'
CELERY_RESULT_SERIALIZER = 'pickle'
CELERY_ACCEPT_CONTENT = ['pickle', 'json']
CELERY_IGNORE_RESULT = True
# 指定调度器模型类
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
# settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'loggers': {
'celery': {
'handlers': ['console'],
'level': 'INFO',
},
},
}
2.celery.py
import os
from celery import Celery
# 设置DJANGO_SETTINGS_MODULE环境变量,指定Django项目的设置模块
os.environ['DJANGO_SETTINGS_MODULE'] = '项目名.settings'
# 解决Celery启动时出现的错误
os.environ.setdefault('FORKED_BY_MULTIPROCESSING','1')
# 创建一个Celery实例,命名为---,我这里用的是项目名
celery_app = Celery('项目名')
# 从Django的设置模块中加载Celery的配置,所有以'CELERY_'开头的设置将被加载
celery_app.config_from_object('django.conf:settings', namespace='CELERY')
# 自动加载Django应用下tasks.py中注册的celery任务函数
celery_app.autodiscover_tasks()
@celery_app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
3._init_.py 即模块目录下的init.py(在django里面应该叫app?)
from __future__ import absolute_import, unicode_literals
from 项目名.celery import celery_app as app
__all__ = ('app',)
4.tasks.py
from 项目名.celery import celery_app
import time
# 定义几个简单的任务
@celery_app.task
def add(x, y):
print(f"任务开始: 计算 {x} + {y}")
time.sleep(5) # 模拟耗时操作
result = x + y
print(f"任务结束: 结果为 {result}")
return result
@celery_app.task
def multiply(x, y):
print(f"任务开始: 计算 {x} * {y}")
time.sleep(3) # 模拟耗时操作
result = x * y
print(f"任务结束: 结果为 {result}")
return result
@celery_app.task
def print_hello():
print("Hello, World!")
return 'hello world'
4.如果Database returned an invalid datetime value. Are time zone definitions for your database installed?
点击链接
这两个随便下一个,解压,执行里面的sql语句即可
5.不知道add任务怎么传参
创建任务时,展开arguments传参即可。比如我这里填了[3,4],该任务计算结果为7(嗯,这是废话)
6.启动worker报的乱七八糟的错,也就是标题那些
首先启动项目
然后
celery -A 模块名 beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
最后
如果没有gevent的话pip install gevent
启动worker
Celery -A 模块名 worker -l info -P gevent
这里最重要的是这个-P gevent,我之前用-P eventlet或者不用,都没法正常执行任务,beat把任务send了,worker卡好久才receive,然后报一堆莫名其妙的错。
成果截图
真的每分钟都在打印hello world啊o(╥﹏╥)o