【发布时间】:2021-05-22 18:27:09
【问题描述】:
我想定期在 django 中运行代码为此我下载了 Celery 并尝试对其进行配置
添加到 settings.py
INSTALLED_APPS = [
'django_celery_results',
'django_celery_beat',
}
CELERY_TIMEZONE = "Australia/Tasmania"
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60
CELERY_RESULT_BACKEND = 'django-db'
CELERY_RESULT_BACKEND = 'django-cache'
CELERY_CACHE_BACKEND = 'default'
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache_table',
}
}
创建了一个 celery.py 文件
import os
from celery import Celery
name='shop'
os.environ.setdefault('DJANGO_SETTINGS_MODULE', name+'.settings')
app = Celery(name)
app.config_from_object('django.conf:settings', namespace='CELERY')
app.conf.beat_schedule = {
'every-15-seconds':{
'task':'offers.tasks.send_email',
'schedule':15,
'args':('dsssew.com',)
}
}
app.conf.timezone = 'UTC'
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print(f'Request: {self.request!r}')
创建了一个tasks.py文件
from __future__ import absolute_import, unicode_literals
from celery import shared_task
@shared_task
def send_email(email):
print(email)
@shared_task
def add(x, y):
return x + y
@shared_task
def mul(x, y):
return x * y
@shared_task
def xsum(numbers):
return sum(numbers)
依次启动一切
python manage.py runserver
celery -A shop worker -l INFO
celery -A shop beat -l INFO
beat 带给我
celery beat v5.0.5 (singularity) 正在启动。 __ - ... __ - _ LocalTime -> 2021-02-18 20:31:57 配置 -> .经纪人 -> amqp://guest:**@localhost:5672// .加载器-> celery.loaders.app.AppLoader .调度程序-> celery.beat.PersistentScheduler . db -> celerybeat-schedule .日志文件 -> [stderr]@%INFO . maxinterval -> 5.00 分钟(300 秒)[2021-02-18 20:31:57,062:INFO/MainProcess] 节拍:开始... [2021-02-18 20:31:57,216: INFO/MainProcess] 调度程序:每 15 秒发送一次到期任务 (offers.tasks.send_email)
但工人每 15 秒倾倒下一个
[2021-02-19 16:18:02,275:警告/SpawnPoolWorker-1] c:\users\admin\appdata\local\programs\python\python37\lib\site-packages\celery\app\trace.py:617: RuntimeWarning:在体外引发异常:TypeError('ord() 预期长度为 1 的字符串,但找到了 int'):回溯(最近 最后调用):文件 "c:\users\admin\appdata\local\programs\python\python37\lib\site-packages\celery\app\trace.py", 第 400 行,在 trace_task 中 request=task_request,文件“c:\users\admin\appdata\local\programs\python\python37\lib\site-packages\celery\backends\base.py”, 第 435 行,在 store_result 中 request=request, **kwargs) 文件 "c:\users\admin\appdata\local\programs\python\python37\lib\site-packages\celery\backends\base.py", 第 851 行,在 _store_result 中 current_meta = self._get_task_meta_for(task_id) 文件“c:\users\admin\appdata\local\programs\python\python37\lib\site-packages\celery\backends\base.py”, 第 869 行,在 _get_task_meta_for meta = self.get(self.get_key_for_task(task_id)) 文件 "c:\users\admin\appdata\local\programs\python\python37\lib\site-packages\django_celery_results\backends\cache.py", 第 19 行,在获取 返回 self.cache_backend.get(key) 文件 "c:\users\admin\appdata\local\programs\python\python37\lib\site-packages\django\core\cache\backends\db.py", 第 51 行,在获取 return self.get_many([key], version).get(key, default) File "c:\users\admin\appdata\local\programs\python\python37\lib\site-packages\django\core\cache\backends \db.py", 第 59 行,在 get_many 中 self.validate_key(key) 文件 "c:\users\admin\appdata\local\programs\python\python37\lib\site-packages\django\core\cache\backends\base.py", 第 249 行,在 validate_key 中 对于 memcache_key_warnings(key) 中的警告:文件“c:\users\admin\appdata\local\programs\python\python37\lib\site-packages\django\core\cache\backends\base.py”, 第 287 行,在 memcache_key_warnings 中 if ord(char)
我不明白错误是什么以及如何解决?
【问题讨论】: