我有一台服务器,其中有两个项目,每个项目都有不同的用途,但两者都需要一个使用芹菜运行调度程序的任务。
我想在同一台服务器上创建一个单独的celenic守护程序,我尝试创建一个差异配置文件,并用2个差异进程运行它。
app1任务.py
from celery import task
@task()
def task_1(data):
print("run task 1.")
app1配置文件:
# Name of nodes to start, here we have a single node
CELERYD_NODES="w1"
# Where to chdir at start.
CELERYD_CHDIR="/usr/app1/task_scheduler/"
# Extra arguments to celeryd
CELERYD_OPTS="--time-limit=300 --concurrency=8"
# Name of the celery config module.
CELERY_CONFIG_MODULE="celeryconfig"
# %n will be replaced with the nodename.
CELERYD_LOG_FILE="/tmp/%n.log"
CELERYD_PID_FILE="/tmp/%n.pid"
app1,celeryconfig.py
BROKER_URL = 'amqp://guest:guest@localhost:5672//'
CELERY_IMPORTS=("tasks")
CELERY_RESULT_BACKEND = "amqp"
CELERY_ENABLE_UTC = False
app2任务.py
from celery import task
@task()
def task_2(data):
print("run task 2.")
除了CELERYD_CHDIR
和CELERYD_NODES
之外,app2配置与app1配置相同。app2-celeryconfig.py与app1-相同
我的问题是当我在app1 上添加新任务时
from tasks import *
if __name__ == "__main__":
...
task_1.apply_async(args=data, eta=t)
task1在app1节点上按预期运行,但此任务全部添加到app2节点。因为节点2没有定义此函数,所以在节点2日志上引发了not_found函数。它仍然可以工作,但我如何设置使task_1只发送到app1芹菜节点。我的意思是节点2将不会接收task_1任务。
应用程序可以使用虚拟主机进行分离
要在使用RabbitMQ时创建虚拟主机,您应该看到:http://www.rabbitmq.com/access-control.html
虚拟主机是传输URL的路径部分:
amqp://user:pass@host:port/vhost
初始斜杠将被忽略,因此如果您的vhost是/foo
,则需要包括额外的斜线,比如:
amqp://guest:guest@localhosts//foo
一个初始化脚本配置示例,使用两个单独的应用程序:
CELERYD_NODES="w1 w2"
CELERYD_OPTS="-A:w1 proj1 -A:w2 proj2 --concurrency:w1=8 --concurrency:w2=4"
有关celery multi
选项语法的更多信息,请参阅:http://docs.celeryproject.org/en/latest/reference/celery.bin.multi.html
然后,您只需将应用程序proj1
配置为使用与proj2
不同的虚拟主机。