有条件地重启监督进程?

Conditional restart of supervisord processes?

我已经使用 supervisord 一段时间了——出色的工具。我无法弄清楚的一个用例是,如何将作业配置为在满足条件之前重新启动,然后停止重新启动。

示例:假设您有一大堆工作要做,例如缩放数千张图像,或为队列中的数百万个请求提供服务。一个有用的模式是 运行 许多工作人员并行处理该积压工作。您可以设置一个 supervisord 作业,确保 100 个工人 运行ning,如果其中任何一个崩溃,supervisord 将启动替换工作,这样工人池就不会缩减。

在工作完成之前,这很好。也许当积压消失时,工作人员的数量应该减少到 1 或 0。Supervisord 将继续增加总数为 100 个进程,即使每个新进程检查是否有工作要做,见 none, 并很快关闭。

有没有办法让流程实例或流程族与主管沟通,说不再需要 autoretsart 行为?更好的是,有没有一种方法可以根据某些条件(例如目录中的文件数或 ??)来增加和减少工作进程的数量。

我知道可以通过更新 supervisord.conf 文件和 运行ning supervisorctl reload 来完成,但如果这样的话,我更喜欢更具声明性和自我管理性的东西存在。

Is there a way for a process instance or process family to communicate with supervisord to say, the autoretsart behavior is no longer needed?

您可以通过确保您的进程在没有工作时以不同的退出代码退出并在配置中使这些代码成为预期的 exitcodes with autorestart=unexpected 来结束 activity。

Better yet, is there a way to scale the number of worker processes up and down based on some condition (like number of files in a directory or ??).

问题在于自动 state transitions don't allow for getting processes running again from an expected EXITED state. AFAIK the only way to do this is with the XML-RPC API's startProcess,因此您需要编写或找到合适的事件侦听器来监视您的开始条件,然后使用 API。

另一种设计是将您的工作进程包装在一个监视 PROCESS COMMUNICATION Events 的事件处理程序中,并让一个正常的子进程将新任务传递给事件侦听器池。但是该模型目前并没有在没有工作时消除等待进程池,它只是以一种可以更容易地分离出与任务相关的逻辑和资源使用的方式来组织控制任务。