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



我有两个模块

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_taskalpha.server上运行,能够调用beta_task而无需在服务器上使用beta_task代码。

这可能吗?

<标题> 更新

另外,我可以阻止beta.taskalpha.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调用中指定路由,要么配置芹菜守护进程以将任务与路由匹配(有几种方法可以做到这一点,所有方法都在该章的示例中进行了说明)

相关内容

  • 没有找到相关文章

最新更新