我有两个模块
alpha.py
beta.py
Run Code Online (Sandbox Code Playgroud)
beta.py只能运行,beta.server因为它需要许可的解算器而不是仅存在beta.server.
在内部alpha.py,有一部分代码调用:
beta_task.apply_async(kwargs={...})
Run Code Online (Sandbox Code Playgroud)
因此,它需要
from beta import beta_task
Run Code Online (Sandbox Code Playgroud)
这反过来又需要神奇的专有模块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
Run Code Online (Sandbox Code Playgroud)
通过将需要在不同项目中分离的每个模块放在一起并在每个模块中实例化相同名称的Celery应用程序,我能够在我的项目中得到这样的东西.然后我按名称调用了任务.
# 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={})
Run Code Online (Sandbox Code Playgroud)
然后,我可以在一台服务器上运行一个项目,在另一台服务器上运行另一个项目,它们通过代理连接,但实际上并不需要相互导入代码.
我之前遇到过这个问题,但从来没有让它“正确”工作。我改用了一个hacky的解决方法。
您可以将import proprietary语句放在beta.beta_taskdef 本身中。您的 'alpha' 文件实际上并没有运行 'beta' def,它只是使用 celery 的任务装饰器来发送有关它的消息。
虽然 PEP 标准规定模块应该位于最外层范围的顶部,但实际上广泛使用的 PyPi 模块通常的做法是将导入放在注册或调用函数中,以便未使用文件的卸载依赖项不会破坏包 [例如,缓存库将在后端激活中导入 redis/memcached 模块,因此除非使用该后端,否则不需要第 3 方模块]。
阿尔法.py
from beta import beta_task
beta_task.apply_async(kwargs={...})
Run Code Online (Sandbox Code Playgroud)
测试版
@task
def beta_task(args):
import proprietary
proprietary.foo()
Run Code Online (Sandbox Code Playgroud)
有关在每台服务器上运行不同任务的更新:芹菜文档的“路由”一章中涵盖了所有内容:http : //docs.celeryproject.org/en/latest/userguide/routing.html
您基本上配置了不同的“队列”(一个用于 alpha,一个用于 beta);启动工作人员只处理您指定的队列;并且要么在对 apply_async 的调用中指定路由,要么配置 celery 守护进程以将任务与路由匹配(有几种方法可以做到这一点,所有方法都在该章节中通过示例进行了解释。)
| 归档时间: |
|
| 查看次数: |
2444 次 |
| 最近记录: |