我有两个模块
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
import开始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_task
def本身中。您的“ 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] 删除。
我来说两句