如何使用 Python Celery 在不同的服务器上执行任务?
How to execute tasks in different server using Python Celery?
假设我有三个服务器 A、B 和 C。服务器 C 将有 celery 任务代码,我需要从服务器 A 和 B 执行它们。
从 celery documentation,我看到有一个 task.py
文件是 运行 作为 celery worker
from celery import Celery
app = Celery('tasks', broker='pyamqp://guest@localhost//')
@app.task
def add(x, y):
return x + y
然后我们有另一个 python 文件(比方说 client.py
)调用这些任务。
from tasks import add
add.delay(4, 4)
在这里我可以看到 client.py
文件依赖于 tasks.py
文件,因为它从 tasks.py
文件导入 task
。如果我们要 运行 这两个文件在不同的服务器中,我们需要将它们解耦并以某种方式调用任务而无需导入代码。我无法弄清楚如何实现这一目标。那么,如何才能做到呢?
一般情况下你不会那样做。您将相同的代码(包含任务)部署到生产者(客户端)和消费者(工作者)。然而,Celery 是一款很酷的软件,它允许您实际安排任务,而无需在生产者端分发代码。为此,您必须使用 send_task() 方法。您必须使用与工作人员相同的参数配置生产者(自然是相同的代理,相同的序列化),并且您必须知道调用任务名称及其参数才能正确安排其执行。
假设我有三个服务器 A、B 和 C。服务器 C 将有 celery 任务代码,我需要从服务器 A 和 B 执行它们。
从 celery documentation,我看到有一个 task.py
文件是 运行 作为 celery worker
from celery import Celery
app = Celery('tasks', broker='pyamqp://guest@localhost//')
@app.task
def add(x, y):
return x + y
然后我们有另一个 python 文件(比方说 client.py
)调用这些任务。
from tasks import add
add.delay(4, 4)
在这里我可以看到 client.py
文件依赖于 tasks.py
文件,因为它从 tasks.py
文件导入 task
。如果我们要 运行 这两个文件在不同的服务器中,我们需要将它们解耦并以某种方式调用任务而无需导入代码。我无法弄清楚如何实现这一目标。那么,如何才能做到呢?
一般情况下你不会那样做。您将相同的代码(包含任务)部署到生产者(客户端)和消费者(工作者)。然而,Celery 是一款很酷的软件,它允许您实际安排任务,而无需在生产者端分发代码。为此,您必须使用 send_task() 方法。您必须使用与工作人员相同的参数配置生产者(自然是相同的代理,相同的序列化),并且您必须知道调用任务名称及其参数才能正确安排其执行。