导入芹菜任务而不导入依赖项

时间:2016-09-07 04:59:57

标签: python celery

我有两个模块

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

2 个答案:

答案 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守护进程以将任务与路由匹配(有几种方法可以做到这一点,所有内容都在本章中用示例进行了解释。)