Python 不同远程机器上的芹菜子任务

Python 不同远程机器上的芹菜子任务,python,rabbitmq,celery,Python,Rabbitmq,Celery,我有两台服务器,芹菜工人在那里工作。让我们称它们为R1和R2 从我的另一台服务器(比如R3),我想创建链式任务,以便创建R1.task task,然后创建R2.task子任务 但我严重怀疑这是否可能。我试过了 # celery_apps.py on R3 from celery import Celery from application.config import get_application_config __author__ = 'hussain' config = get_app

我有两台服务器,芹菜工人在那里工作。让我们称它们为R1和R2

从我的另一台服务器(比如R3),我想创建链式任务,以便创建R1.task task,然后创建R2.task子任务

但我严重怀疑这是否可能。我试过了

# celery_apps.py on R3
from celery import Celery

from application.config import get_application_config

__author__ = 'hussain'

config = get_application_config()

celery_app_r1 = Celery(
    'R1',
    broker=config.CELERY_BROKER_URL_R1
)

celery_app_r2 = Celery(
    'R2',
    broker=config.CELERY_BROKER_URL_R2
)

celery_app_r1.conf.update(
    CELERY_TASK_SERIALIZER='json',
    CELERY_RESULT_SERIALIZER='json',
    CELERY_ACKS_LATE='True',
    CELERY_ACCEPT_CONTENT=['json']
)

celery_app_r2.conf.update(
    CELERY_TASK_SERIALIZER='json',
    CELERY_RESULT_SERIALIZER='json',
    CELERY_ACKS_LATE='True',
    CELERY_ACCEPT_CONTENT=['json']
)
这就是我试图创建链接任务的方式

# client.py on R3
from celery import subtask
celery_app_r1.send_task(
    'communication.tasks.send_push_notification',
    (json.dumps(payload), ),
    exchange=config.CELERY_COMMUNICATION_EXCHANGE,
    routing_key=config.CELERY_PN_ROUTING_KEY,
    link=subtask(
        'application.tasks.save_pn_response',
        (device.id, ),
        exchange=config.CELERY_RECRUITMENT_EXCHANGE,
        routing_key=config.CELERY_CALLBACKS_ROUTING_KEY
    )
)
我根本不可能提到芹菜


如何在不同的远程计算机上运行这些子任务?

您不需要两个应用程序、两个代理或两个交换。代理是您的机器之间用于通信等的共享链接

您需要的是两个队列,每个服务器一个,并使用不同的路由密钥或直接强制队列名称相应地路由任务

快速示例:

CELERY_QUEUES = (
    Queue('notifications'),
    Queue('callbacks')
)
然后在每台服务器中启动一个工作进程,其中包括:

celery worker --app app -Q notifications --loglevel info
celery worker --app app -Q callbacks --loglevel info
并从通知中发送回调任务:

@app.task(queue='notifications')
def notification_task(*args, **kwargs):
    # ... whatever your notification logic is
    callback.s(arg1, arg2).delay()

@app.task(queue='callbacks')
def callback(*args, **kwargs)
    # ...

注意,我没有使用
send_task
,而是直接导入函数。您不需要
send_task
,除非您是从具有不同代码库的服务器调用任务。也就是说,如果您的项目不断增长,并希望分离存储库等,则不需要2个应用程序、2个代理或2个交换。代理是您的机器之间用于通信等的共享链接

您需要的是两个队列,每个服务器一个,并使用不同的路由密钥或直接强制队列名称相应地路由任务

快速示例:

CELERY_QUEUES = (
    Queue('notifications'),
    Queue('callbacks')
)
然后在每台服务器中启动一个工作进程,其中包括:

celery worker --app app -Q notifications --loglevel info
celery worker --app app -Q callbacks --loglevel info
并从通知中发送回调任务:

@app.task(queue='notifications')
def notification_task(*args, **kwargs):
    # ... whatever your notification logic is
    callback.s(arg1, arg2).delay()

@app.task(queue='callbacks')
def callback(*args, **kwargs)
    # ...

注意,我没有使用
send_task
,而是直接导入函数。您不需要
send_task
,除非您是从具有不同代码库的服务器调用任务。也就是说,如果您的项目不断增长,并且希望分离存储库等

我肯定需要使用
发送任务
。正如您所说,使用
send_task
的目的是将代码库分开放置。1.R3只有芹菜客户端代码2。R1和R2有特定的代码库,现在我明白了。我想我会觉得困惑,以为我需要两个经纪人。我所做的工作是与一个代理以及R1和R2上的工作人员一起使用不同的队列。我可能应该记下我的问题。芹菜作者明确不建议从另一个类中调用子任务,使用链或组我肯定需要使用
send\u task
。正如您所说,使用
send_task
的目的是将代码库分开放置。1.R3只有芹菜客户端代码2。R1和R2有特定的代码库,现在我明白了。我想我会觉得困惑,以为我需要两个经纪人。我所做的工作是与一个代理以及R1和R2上的工作人员一起使用不同的队列。我可能应该记下我的问题。芹菜作者、使用链或组明确不建议从另一个类中调用子任务