调试永远挂起的 Celery 任务调用 OptaPy

问题描述 投票:0回答:1

我尝试使用 Redis 作为代理在 Django 应用程序中的 Celery 任务中运行 OptaPy。该任务被 Celery 工作线程接收,但永远保持

PENDING
并且不返回任何结果

如果我设置

CELERY_TASK_ALWAYS_EAGER = True
进行调试,代码运行良好,但同步。

可能是什么问题?我可以采取哪些步骤来找出答案?

由于 OptaPy 是 Java 库的 Python 包装器,我怀疑 Celery 可能无法很好地处理附加线程,但我不知道如何调试或修复此问题。

这是有问题的 Celery 任务,可以根据要求提供其他代码:

@shared_task()
def schedule_task():

    solver_config = optapy.config.solver.SolverConfig() \
        .withEntityClasses(Lesson) \
        .withSolutionClass(TimeTable) \
        .withConstraintProviderClass(define_constraints) \
        .withTerminationSpentLimit(Duration.ofSeconds(30))

    solution = solver_factory_create(solver_config) \
        .buildSolver() \
        .solve(generate_problem())

    return str(solution)
django celery python-multithreading optapy
1个回答
0
投票

这个答案似乎也适用于这里:

默认情况下,celery 使用多处理库作为并发实现。 [...] 不幸的是,在分叉子进程后,线程不会继承,因此会创建僵尸。

使用

--pool threads
选项启动 Celery Worker 对我来说很有效:

celery -A myapp worker --pool threads --loglevel=info
© www.soinside.com 2019 - 2024. All rights reserved.