python 长时间运行的守护进程作业处理器

2 投票
5 回答
3518 浏览
提问于 2025-04-15 12:48

我想写一个长时间运行的程序(Linux守护进程),它有两个主要功能:

  • 响应REST网络请求
  • 执行可以安排的任务

最开始,我是把它做成一个简单的程序,运行时进行更新,然后用cron定时执行。但现在我需要增加REST的功能,同时也想改变一些任务的执行频率,而其他任务的频率不变(比如说,每个任务的频率都不一样)。

我对写长时间运行的程序完全没有经验,尤其是那种可以自己执行任务的程序,而不是只响应请求的。

我基本的计划是把REST部分放在一个单独的线程或进程中,然后把任务部分也单独运行。

我想知道有没有什么模式,特别是在Python方面(我查过,但没找到我想要的例子),或者有没有人能给我一些建议,帮我把项目转变成满足这些新需求的方向。我见过一些涉及调度的项目,但我真的想听听大家的真实使用经验和建议。什么方法对你有效,什么又不行呢?

5 个回答

1

我们做了以下几件事。

  1. 写了一个简单的、纯粹的 WSGI 网络应用,用来响应 REST 请求。

    • 启动任务

    • 报告任务状态

  2. 扩展了内置的 wsgiref 服务器,使用 select 模块来检查是否有新的请求进来。

    • 当套接字有活动时,说明有普通的 REST 请求,我们让 wsgiref 来处理这个请求。最终,它会调用我们的 WSGI 应用来响应状态和提交请求。

    • 超时意味着我们需要做两件事:

      • 检查所有正在运行的子任务,看看它们是否完成。更新它们的状态等等。

      • 检查类似 crontab 的计划,看看是否有任何安排好的工作要做。这是一个由这个服务器维护的 SQLite 数据库。

1

一种选择是从这个列表中挑一个轻量级的WSGI服务器:

然后让它来处理那些需要长时间运行的请求。 (我推荐使用Spawning。)这样你的代码就可以专注于REST API和通过清晰的WSGI接口处理请求,以及安排任务。

你可以使用至少几个调度库,但我对它们了解不多:

3
  • 如果REST服务器和定时任务之间没有任何联系,那就分别实现这两部分,REST服务器和任务部分,作为独立的进程运行。

  • 之前提到过,可以看看现有的调度程序来处理任务部分。我不确定Twisted是否是一个替代方案,但你可以考虑一下这个平台。

  • 另一方面,如果REST接口调用的功能和定时任务是一样的,那你应该把它们看作是同一功能的两个接口,比如这样:

    • 把实际的任务写成REST服务器可以分叉并运行的程序。
    • 有一个单独的调度器来处理任务的时间安排。
    • 如果某个任务该运行了,就让调度器向本地服务器发出相应的REST请求。这样调度器只处理任务描述,而不需要知道它们是怎么实现的。
  • 对于长时间运行、高可用性的进程,通常会有一个额外的“监控”进程,它只负责检查必要的服务是否在运行,并在需要时重启它们。

撰写回答