导入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.pyimport开始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 proprietary语句放在beta.beta_taskdef本身中。您的“ alpha”文件实际上并没有运行“ beta” def,它只是使用celery的任务装饰器来发送有关此文件的消息。

尽管PEP标准规定模块应位于最外层范围的顶部,但实际上,对于广泛使用的PyPi模块,通常将导入放置在注册或调用函数中,以使未使用文件的卸载依存关系不会破坏程序包[例如,缓存库将在后端激活内导入redis / memcached模块,因此,除非使用该后端,否则不需要第三方模块。

字母

from beta import beta_task

beta_task.apply_async(kwargs={...})

测试版

@task
def beta_task(args):
    import proprietary
    proprietary.foo()

有关在每个服务器上运行不同任务的更新:celery文档的“路由”一章中介绍了所有内容:http : //docs.celeryproject.org/en/latest/userguide/routing.html

您基本上配置了不同的“队列”(一个用于alpha,一个用于beta)。启动工作程序以仅处理您指定的队列;并在对apply_async的调用中指定路由,或者将celery守护程序配置为将任务与路由匹配(有几种方法可以完成该任务,在本章中将通过示例进行说明)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章