概述:
我正在尝试将 celery 作为守护进程运行来执行发送电子邮件的任务。它在开发中运行良好,但在生产中却运行不佳。我现在有了我的网站,每个功能都工作正常(没有 django 错误),但由于守护进程未正确设置,任务无法完成,并且我在 ubuntu 16.04 中收到此错误:
project_celery FATAL can't find command '/home/my_user/myvenv/bin/celery'
安装的程序/硬件,以及我到目前为止所做的事情:
我在 VPS 上使用 Django 2.0.5、python 3.5、ubuntu 16.04、rabbitmq 和 celery。我使用 venv 来完成这一切。我也安装了主管,当我检查时它正在运行sudo service --status-all
,因为它旁边有一个+。Erlang 也已安装,当我检查时top
,rabbitmq 正在运行。使用sudo service rabbitmq-server status
表明rabbitmq也处于活动状态。
最初,我按照celery 网站上的说明进行操作,但它们非常令人困惑,并且在测试/阅读/观看其他人的解决方案约 40 小时后我无法让它工作。感到非常恼怒和挫败,我选择了这里的方向来设置守护进程并希望我能到达某个地方,并且我已经走得更远,但我收到了上面的错误。
我通读了主管文档,检查了进程状态以尝试调试问题以及程序设置,但我迷失了,因为根据文档,据我所知,我的路径是正确的。
这是我的文件结构:
home/
my_user/ # is a superuser
portfolio-project/
project/
__init__.py
celery.py
settings.py # this file is in here too
app_1/
app_2/
...
...
logs/
celery.log
myvenv/
bin/
celery …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 django 视图中异步运行任务。为此,我使用 celery 和rabbitmq。通过遵循小规模上下文指南,我在模块(servicenow.py)中将任务定义为 -
app = Celery('servicenow',broker='amqp://username:password@localhost:15672')
.
.
@app.task
def get_ITARAS_dump(self):
.
.
self.update_state(state='PROGRESS',meta={'current':i,'total':len(taskList)})
Run Code Online (Sandbox Code Playgroud)
我的rabbitmq服务器在brew服务中运行
之后我尝试启动一个工作实例,
celery -A servicenow worker -l info
然后我的错误消息为 -
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.7/bin/celery", line 11, in <module>
sys.exit(main())
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/celery/__main__.py", line 30, in main
main()
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/celery/bin/celery.py", line 81, in main
cmd.execute_from_commandline(argv)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/celery/bin/celery.py", line 793, in execute_from_commandline
super(CeleryCommand, self).execute_from_commandline(argv)))
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/celery/bin/base.py", line 311, in execute_from_commandline
return self.handle_argv(self.prog_name, argv[1:])
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/celery/bin/celery.py", line 785, in handle_argv …
Run Code Online (Sandbox Code Playgroud) 保存模型时我需要调用 celery 任务。我有冲突的导入,我不知道如何解决。我想知道是否有人知道我可以构建它以避免冲突的导入的另一种方法
models.py
from .tasks import celery_task
class Picture(PolymorphicModel):
file = models.ImageField()
processed_file = models.ImageField(blank=True, null=True)
...
def save(self, *args, **kwargs):
if self.file:
self.processed_file = celery_task.delay(self.id, other_arg)
super(Picture, self).save(*args, **kwargs)
tasks.py
from .models import Picture
@task
def celery_task(id, other_arg):
try:
picture = Picture.objects.get(id=id)
except ObjectDoesNotExist:
picture = None
if picture:
return some_other_function(picture.file)
return None
Run Code Online (Sandbox Code Playgroud) 当尝试创建两个单独的专用工作人员时,我无法将任务发送到芹菜。我已经阅读了文档和这个问题,但它并没有改善我的情况。
我的配置如下:
CELERY_RESULT_BACKEND = 'django-db'
CELERY_BROKER_URL = f'redis://{env("REDIS_HOST")}:{env("REDIS_PORT")}/{env("REDIS_CELERY_DB")}'
CELERY_DEFAULT_QUEUE = 'default'
CELERY_DEFAULT_EXCHANGE_TYPE = 'topic'
CELERY_DEFAULT_ROUTING_KEY = 'default'
CELERY_QUEUES = (
Queue('default', Exchange('default'), routing_key='default'),
Queue('media', Exchange('media'), routing_key='media'),
)
CELERY_ROUTES = {
'books.tasks.resize_book_photo': {
'queue': 'media',
'routing_key': 'media',
},
}
Run Code Online (Sandbox Code Playgroud)
任务在文件中按以下方式定义tasks.py
:
import logging
import time
from celery import shared_task
from books.models import Author, Book
from books.commands import resize_book_photo as resize_book_photo_command
logger = logging.getLogger(__name__)
@shared_task
def list_test_books_per_author():
time.sleep(5)
queryset = Author.objects.all()
for author in queryset:
for book in author.testing_books: …
Run Code Online (Sandbox Code Playgroud) 我仔细研究了非常类似的 stackoverflow 问题,并将我的代码更改为现在的样子。我仍然收到cannot resolve broker hostname
错误。如果我只是使用amqp:user:mypass@locahost:5672
我会得到connection refused
# docker-compoose.yml
version: "3.8"
services:
broker:
image: rabbitmq:3-management-alpine
hostname: rabbit1
environment: &env
RABBITMQ_ERLANG_COOKIE: "SWQOKODSQALRPCLNMEQG"
RABBITMQ_DEFAULT_USER: "user"
RABBITMQ_DEFAULT_PASS: "password"
RABBITMQ_DEFAULT_VHOST: "/"
CELERY_BROKER_URL: "amqp://user:password@rabbit1:5672"
ports:
- "5672:5672"
- "15672:15672"
expose:
- "5672"
networks:
- webnet
volumes:
- .:/home/user
worker:
build:
context: .
dockerfile: ./worker/Dockerfile
command: ["celery", "worker", "--app=worker.tasks.app", "--loglevel=INFO"]
environment:
<<: *env
links:
- broker
depends_on:
- broker
networks:
- webnet
volumes:
- .:/home/user
networks:
webnet:
Run Code Online (Sandbox Code Playgroud)
# Dockerfile
FROM python:3.7-slim …
Run Code Online (Sandbox Code Playgroud) 我正在 Windows 10 中使用 Django 3 开发一个应用程序。
我已经安装了celery、RabitMQ 和flower。芹菜效果很好,但是当我跑步时
celery -A proj flower
产生以下错误
[I 200718 21:32:31 command:134] Visit me at http://localhost:5555
[I 200718 21:32:31 command:141] Broker: amqp://guest:**@localhost:5672//
[I 200718 21:32:31 command:142] Registered tasks:
['apps.tareas.task.send_emails_users',
'celery.accumulate',
'celery.backend_cleanup',
'celery.chain',
'celery.chord',
'celery.chord_unlock',
'celery.chunks',
'celery.group',
'celery.map',
'celery.starmap']
Traceback (most recent call last):
File "C:\Program Files\Python38\lib\runpy.py", line 193, in _run_module_as_main
return _run_code(code, main_globals, None,
File "C:\Program Files\Python38\lib\runpy.py", line 86, in _run_code
exec(code, run_globals)
File "C:\Users\Sofia\OneDrive\Proyectos\Django 3\shop\env\Scripts\celery.exe\__main__.py", line 9, in <module>
File "c:\users\sofia\onedrive\proyectos\django 3\shop\env\lib\site-packages\celery\__main__.py", line …
Run Code Online (Sandbox Code Playgroud) 我尝试在 Heroku 上托管的 Django 项目上运行计划任务,但是我的任务不断崩溃,我不知道如何解决这个问题。这是我在错误日志中收到的错误消息。我在 settings.py 中将时区设置为“America/New_York”,我什至尝试在 celery.py 中添加时区以尝试对其进行故障排除,但对其没有影响。我很感激你的帮助。谢谢
完整回溯
2020-09-29T14:42:42.978802+00:00 app[beat.1]: [2020-09-29 10:42:42,978: INFO/MainProcess] DatabaseScheduler: Schedule changed.
2020-09-29T14:42:42.978947+00:00 app[beat.1]: [2020-09-29 10:42:42,978: INFO/MainProcess] Writing entries...
2020-09-29T14:42:43.007143+00:00 app[beat.1]: [2020-09-29 10:42:43,006: INFO/MainProcess] Writing entries...
2020-09-29T14:42:43.009099+00:00 app[beat.1]: [2020-09-29 10:42:43,007: CRITICAL/MainProcess] beat raised exception <class 'TypeError'>: TypeError("can't compare offset-naive and offset-aware datetimes",)
2020-09-29T14:42:43.009100+00:00 app[beat.1]: Traceback (most recent call last):
2020-09-29T14:42:43.009101+00:00 app[beat.1]: File "/app/.heroku/python/lib/python3.6/site-packages/celery/apps/beat.py", line 109, in start_scheduler
2020-09-29T14:42:43.009102+00:00 app[beat.1]: service.start()
2020-09-29T14:42:43.009103+00:00 app[beat.1]: File "/app/.heroku/python/lib/python3.6/site-packages/celery/beat.py", line 631, in start
2020-09-29T14:42:43.009103+00:00 app[beat.1]: interval = self.scheduler.tick()
2020-09-29T14:42:43.009104+00:00 …
Run Code Online (Sandbox Code Playgroud) 在我当前的项目中,我需要做的是从 700 多个端点获取数据,然后将该数据发送到另外 700 多个端点。我的方法是使用 Django Celery Redis,在每个工作人员上放置 70 多个端点,以便有大约 10 个工作人员将检索数据然后发布数据。
为此,我使用 Chord 执行并行任务,然后计算所需的时间。
问题是 Celery 多次运行相同的任务。task_get_data
是主要方法,首先获取网站列表,然后将其分成每组 70 个,然后task_post_data
使用 Chord 调用。
在下面的输出中website_A
,您可以website_B
多次看到 等,我已经手动检查了我的数据和所有内容,并且没有重复的网站,但是当提交 celery 任务时,会创建多个条目。
另外,有没有办法监控工人的数量以及他们正在处理什么?
下面是代码
os.environ.setdefault('DJANGO_SETTINGS_MODULE','django_backend.settings')
app = Celery('django_backend', backend='redis://localhost:6379', broker='redis://localhost:6379')
app.config_from_object('django.conf:settings', namespace='CELERY')
# app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
def post_data(json_obj, website):
for items in json_obj:
md = md + items['data']
n = 50
list_of_objects = [md[i:i+n] for i in range(0, len(md), n)]
print("Starting to post …
Run Code Online (Sandbox Code Playgroud) 我正在构建一个基于 Django 的项目,我的目的之一是拥有一个从 Telegram 组接收信息的 Telegram 机器人。我能够实现机器人在 Telegram 中发送消息,没有任何问题。
目前,我有几个与 Beat 一起运行的 Celery 任务以及 Django Web(已解耦)。这里一切都好。
我已经看到 python-telegram-bot 正在一个示例中运行一个函数(https://github.com/python-telegram-bot/python-telegram-bot/blob/master/examples/echobot.py)它正在等待空闲以接收来自 Telegram 的数据。现在,我在 Celery 中的所有任务此时都是周期性的,并且由 Beat 每 10 或 60 分钟调用一次。如何在我的配置中使用 Celery 运行这个非周期性任务?我说非周期性是因为我知道它将等待内容直到被手动中断。
姜戈~=3.2.6
芹菜~=5.1.2
CELERY_BEAT_SCHEDULE = {
'task_1': {
'task': 'apps.envc.tasks.Fetch1',
'schedule': 600.0,
},
'task_2': {
'task': 'apps.envc.tasks.Fetch2',
'schedule': crontab(minute='*/60'),
},
'task_3': {
'task': 'apps.envc.tasks.Analyze',
'schedule': 600,
},
Run Code Online (Sandbox Code Playgroud)
}
在我的tasks.py 中,我有这样的任务之一:
@celery_app.task(name='apps.envc.tasks.TelegramBot')
def TelegramBot():
status = start_bot()
return status
Run Code Online (Sandbox Code Playgroud)
作为 start_bot 实现,我只是复制了 echobot.py 示例,并在其中添加了我的 TOKEN(当然示例中不同命令的函数也在那里)。
我正在尝试运行 celery -A 项目工作人员 -l 信息。但每次它都会返回一个错误,例如init遇到意外错误。请帮助。提前致谢。
我的设置文件:
CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Africa/Nairobi'
Run Code Online (Sandbox Code Playgroud)
芹菜文件:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# setting the Django settings module.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
app = Celery('project')
app.config_from_object('django.conf:settings', namespace='CELERY')
# Looks up for task modules in Django applications and loads them
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task():
print('Request')
Run Code Online (Sandbox Code Playgroud)
初始化文件
from __future__ import absolute_import
# This will make sure …
Run Code Online (Sandbox Code Playgroud)