多个 Python-Celery 脚本冲突且不执行
Multiple Python-Celery Scripts conflict and doesn't execute
我有两个 不同 python 脚本 在 不同目录 中有 celery 调度器。
脚本 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: ERROR/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_]
键错误:'scheduler1.proxy'
我尝试引用多个答案,但没有任何效果。
您看到的问题是 celery 在项目 1 和项目 2 中使用相同的 "broker"。为了同时使用两个不同的 celery 项目,您所要做的就是给它们不同的经纪人。您可以使用 broker_url
setting 指定代理。
我们通常使用redis作为代理,所以很简单,一个项目放在redis db 0上,另一个项目放在redis db 1上。也就是说,有很多thinking that normally goes into which broker to use,并且决定经纪人不在这个特定问题的范围内。
我有两个 不同 python 脚本 在 不同目录 中有 celery 调度器。
脚本 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: ERROR/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_] 键错误:'scheduler1.proxy'
我尝试引用多个答案,但没有任何效果。
您看到的问题是 celery 在项目 1 和项目 2 中使用相同的 "broker"。为了同时使用两个不同的 celery 项目,您所要做的就是给它们不同的经纪人。您可以使用 broker_url
setting 指定代理。
我们通常使用redis作为代理,所以很简单,一个项目放在redis db 0上,另一个项目放在redis db 1上。也就是说,有很多thinking that normally goes into which broker to use,并且决定经纪人不在这个特定问题的范围内。