我尝试使用 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)
这个答案似乎也适用于这里:
默认情况下,celery 使用多处理库作为并发实现。 [...] 不幸的是,在分叉子进程后,线程不会继承,因此会创建僵尸。
使用
--pool threads
选项启动 Celery Worker 对我来说很有效:
celery -A myapp worker --pool threads --loglevel=info