多个Python-Celery脚本发生冲突,无法执行

时间:2019-09-14 10:44:04

标签: python python-3.x celery celery-task

我有两个 不同 python 脚本不同目录中调度程序。

脚本1:

import requests
from celery import Celery
from celery.schedules import crontab
import subprocess

celery = Celery()
celery.conf.enable_utc = False


@celery.task()
def proxy():
    response = requests.get(url="XYZ")
    proxies = response.text

    paid_proxies = open("paid_proxies.txt", "w+")
    paid_proxies.write(proxies.strip())
    paid_proxies.close()


celery.conf.beat_schedule = {
    "proxy-api": {
        "task": "scheduler1.proxy",
        "schedule": crontab(minute="*/5")
    }
}

我用来执行该命令的命令:

celery beat -A scheduler1.celery
celery worker -A scheduler1.celery

脚本2:

from celery import Celery
from celery.schedules import crontab
import subprocess

celery = Celery()
celery.conf.enable_utc = False


@celery.task()
def daily():
    subprocess.run(["python3", "cross_validation.py"])


celery.conf.beat_schedule = {
    "daily-scraper": {
        "task": "scheduler2.daily",
        "schedule": crontab(day_of_week="*", hour=15, minute=23)
    }
}

我用来执行该命令的命令:

celery beat -A scheduler2.celery
celery worker -A scheduler2.celery

问题是当我执行脚本1时,它可以正常运行。但是,当我尝试执行脚本2时,由于Scheduler2尝试执行scheduler1的任务而出现此错误:

[2019-09-14 15:10:00,127:错误/ MainProcess]收到类型为“ scheduler1.proxy”的未注册任务。 该邮件已被忽略并丢弃。

您还记得导入包含此任务的模块吗? 或者也许您正在使用相对进口商品?

请参阅 http://docs.celeryq.org/en/latest/internals/protocol.html 有关更多信息。

消息正文的完整内容为: '[[],{},{“ callbacks”:null,“ errbacks”:null,“ chain”:null,“ chord”:null}]]“(77b) 追溯(最近一次通话):   文件“ /home/PycharmProjects/data_scraping/venv/lib/python3.6/site-packages/celery/worker/consumer/consumer.py”,行559,在on_task_received中     策略=策略[type_] KeyError:“ scheduler1.proxy”

我尝试引荐多个答案,但是没有用。

1 个答案:

答案 0 :(得分:1)

您看到的问题是,芹菜在项目1和项目2中都使用相同的“经纪人”。为了同时使用两个不同的芹菜项目,您要做的就是给他们提供不同的经纪人。您可以使用broker_url setting指定经纪人。

我们通常使用redis作为代理,因此将一个项目放在redis db 0上,而将另一个项目放在redis db 1上非常简单。也就是说,有很多thinking that normally goes into which broker to use,然后决定经纪人不在此特定问题的范围内。