我有两个模块
alpha.py
beta.py
beta.py
只能在beta.server
上运行,因为它需要一个许可的求解器,而不只是在beta.server
上存在。
在alpha.py
中,有一部分代码调用:
beta_task.apply_async(kwargs={...})
因此,它要求
from beta import beta_task
这反过来又需要只在beta.server
上可用的神奇专有模块。
我需要启用alpha_task
在alpha.server
上运行,能够调用beta_task
而无需在服务器上使用beta_task
代码。
这可能吗?
<标题> 更新另外,我可以阻止beta.task
在alpha.server
上运行吗?
由于alpha.py
导入beta.py
,守护进程找到beta.task
并监听以下类型的任务:
- ** ---------- [config]
- ** ---------- .> app: app_app
- ** ---------- .> transport: asdfasdfasd
- ** ---------- .> results: adfasdfasdf
- *** --- * --- .> concurrency: 12 (prefork)
-- ******* ----
--- ***** ----- [queues]
-------------- .> celery exchange=celery(direct) key=celery
[tasks]
. alpha.alpha_task
. beta.beta_task
标题>我能够得到这样的东西在我的项目工作通过把每个模块需要在不同的项目分开,并实例化芹菜应用程序在每个具有相同的名称。然后按名称调用任务。
# Import the app you created in the celeryconfig.py for your project
from celeryconfig import app
app.send_task('beta.tasks.beta_task', args=[2, 2], kwargs={})
然后我可以在一个服务器上运行一个项目,在另一个服务器上运行另一个项目,它们通过代理连接,但实际上不需要从彼此导入代码。
我以前遇到过这种情况,但从未让它"正确"工作。我使用了一个hack的方法。
可以将import proprietary
语句放在beta.beta_task
def本身中。你的'alpha'文件并没有实际运行'beta' def,它只是使用了芹菜的任务装饰器来分派一个关于它的消息。
虽然PEP标准规定模块应该位于最外层作用域的顶部,但对于广泛使用的PyPi模块来说,将导入放在注册或调用函数中实际上是一种常见的做法,以便卸载未使用文件的依赖项不会破坏包[例如,缓存库将在后端激活中导入redis/memcached模块,因此不需要第三方模块,除非后端被使用]。
alpha.py
from beta import beta_task
beta_task.apply_async(kwargs={...})
beta.py
@task
def beta_task(args):
import proprietary
proprietary.foo()
关于在每个服务器上运行不同任务的更新:这在芹菜文档的"路由"章节中都有涉及:http://docs.celeryproject.org/en/latest/userguide/routing.html
你基本上配置不同的'队列'(一个用于alpha,一个用于beta);启动worker,只处理你指定的队列;并且要么在apply_async调用中指定路由,要么配置芹菜守护进程以将任务与路由匹配(有几种方法可以做到这一点,所有方法都在该章的示例中进行了说明)