执行Celery任务后保留初始化变量

时间:2016-01-12 13:09:55

标签: python celery

我有一些代码是这样的:

model = None

@app.task()
def compute_something():
    global model
    if model is None:
        # Initialize model
    # Use model to perform computation

所以我希望设置代码(冗长的模型初始化)在必要时只执行一次,并且进一步调用相同的任务可以重用这些初始化变量。

我知道这部分打破了任务严格原子的概念。但默认情况下,这似乎不起作用,因为(我假设)多处理为每个任务分配不同的进程,从而失去初始化。

有没有办法实现这样的目标?

相关问题:

另一种看待这种情况的方法是,工作人员是否有办法查看任务队列并将任务分组以更有效地执行它们?

让我们假设一个工作人员同时处理一组任务会比一个接一个地执行任务更有效率(例如GPU作业,或者将大型参数文件加载到内存中)。

我想知道工作人员是否有办法在任务队列中收集同一任务的多个实例,并以批处理方式而不是一个一个地处理它们。

1 个答案:

答案 0 :(得分:0)

您可以在模块级别初始化模型:

model = initialise_model()

@app.task()
def compute_something():
    # Use model to perform computation

然而,这假设模型初始化不依赖于传递给任务的任何内容,并且模型不会以任何方式被任务修改。

第二个问题没有多大意义。你能给出一些背景吗?什么是"小组任务"究竟?您是否希望在特定主机上运行某些任务以优化对共享资源的访问?如果是这样,那么请阅读有关路由的芹菜文档。