需求: 用py实现一个任务管理器

  • 任务可 add/stop 操作, 并且有状态调度
  • stop时立即清理, 包括所有子进程
  • 子进程可能启动新的进程/线程

结论:
用线程池+信号量实现. 仅对高耗时的循环操作添加信号量.
不提供强制终止功能, 因为Python 没有原生的线程安全/进程安全的强制终止方式
强制终止可能导致: 锁未释放(死锁风险)/内存泄漏/僵尸进程/数据损坏(例如文件写入中断)

方案对比:

  1. 线程/进程池: 只能干预未开始的future, 不能停止已存在的
  2. pkill: 无效
  3. process.terminate: sig 15信号, 无法立刻终止阻塞的动作, 如io/sleep. 此外, process方法的子进程里如果有阻塞动作, 在fastapi中会阻塞事件循环.
  4. process.kill方法: sig 9 信号, 可以立刻终止. 但是如果子任务有新子进程, 会导致僵尸进程
  5. os.killpg方法: 同上
  6. 主流可行的方法:
    • 记录pid树: 子进程调用太麻烦
    • 传递stop信号: 也相对麻烦, 调用原子函数需要层层传递