我有两个模块
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
答案 0 :(得分:6)
通过将需要在不同项目中分离的每个模块放在每个模块中并使用相同名称实例化Celery应用程序,我能够在我的项目中工作。然后我打电话给task by name。
# 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={})
然后,我可以在一台服务器上运行一个项目,在另一台服务器上运行另一个项目,它们通过代理连接,但实际上并不需要相互导入代码。
答案 1 :(得分:4)
我之前遇到过这种情况,但从来没有让它发挥作用"正确"。我使用了一种hacky解决方法。
您可以将import proprietary
语句放入beta.beta_task
def本身。你的阿尔法'文件实际上没有运行' 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时指定路由或配置celery守护进程以将任务与路由匹配(有几种方法可以做到这一点,所有内容都在本章中用示例进行了解释。)