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

时间:2009-07-10 05:16:44

标签: python web-services scheduling long-running-processes

我想写一个长期运行的进程(linux守护进程),它有两个目的:

  • 响应REST Web请求
  • 执行可以安排的作业

我最初将它作为一个简单的程序运行,它将贯穿运行并执行我随后编写的更新,但现在我已经添加了REST要求,并且还希望更改某些作业的频率,但是而不是其他人(假设所有工作都有不同的频率)。

我有编写长时间运行流程的经验,特别是那些自己做事情而不是回应请求的流程。

我的基本计划是在一个单独的线程/进程中运行REST部分,并认为我将单独运行作业部分。

我想知道是否存在任何模式,特别是python,(我看过并且没有真正找到我想要做的任何示例)或者是否有任何建议从何处开始转换我的项目满足这些新要求。 我已经看到一些涉及日程安排的项目,但我真的在这里寻找真实世界的用户体验/建议。什么有用/不适合你?

5 个答案:

答案 0 :(得分:2)

  • 如果REST服务器和预定作业没有任何共同点,请执行两个单独的实现,即REST服务器和作业内容,并将它们作为单独的进程运行。

  • 如前所述,查看作业内容的现有调度程序。我不知道Twisted是否可以替代,但您可能想要查看此平台。

  • 如果,OTOH,REST接口调用与计划作业相同的功能,您应该尝试将它们视为具有相同功能的两个接口,例如像这样:

    • 将实际作业写为REST服务器可以分叉运行的程序。
    • 有一个单独的调度程序来处理作业的时间安排。
    • 如果作业要运行,请让调度程序向本地服务器发出相应的REST请求。 这样,调度程序只处理作业描述,但不知道它们是如何实现的。
  • 长期运行,高可用性流程的一个共同特点就是拥有一个额外的“主管”流程,只需检查必要的恶魔是否已启动并运行,并在必要时重新启动它们。

答案 1 :(得分:1)

一种选择是从这个列表中简单地选择一个轻量级WSGI服务器:

让它完成为请求提供服务的长期运行流程。 (我建议Spawning。)您的代码可以专注于REST API并通过定义良好的WSGI接口和调度作业来处理请求。

您可以使用至少几个调度库,但我对它们知之甚少:

答案 2 :(得分:1)

这就是我们所做的。

  1. 写了一个简单的纯wsgi Web应用程序来响应REST请求。

    • 开始工作

    • 报告工作状态

  2. 扩展内置wsgiref服务器以使用select模块检查传入请求。

    • 套接字上的活动是普通的REST请求,我们让wsgiref处理这个。 它将 - 最终 - 调用我们的WSGI应用程序来响应状态和 提交请求。

    • 超时意味着我们必须做两件事:

      • 检查所有正在运行的孩子是否已完成。更新他们的状态等。

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

答案 3 :(得分:0)

我通常使用cron进行日程安排。至于REST,您可以使用众多的Web框架之一。但是只运行SimpleHTTPServer就足够了。

您可以使用cron @reboot

计划REST服务启动
@reboot (cd /path/to/my/app && nohup python myserver.py&)

答案 4 :(得分:0)

调度程序的通常设计模式是:

  • 维护预定作业列表,按下一个运行时间排序(作为日期 - 时间值);
  • 唤醒时,将列表中的第一个作业与当前时间进行比较。如果它已到期或已过期,请将其从列表中删除并运行它。继续以这种方式通过列表,直到第一个作业尚未到期,然后进入睡眠状态(next_job_due_date - current_time);
  • 当作业完成后,如果合适,重新安排;
  • 在计划中添加作业后,请唤醒计划程序进程。

根据您的情况适当调整(例如,有时您可能希望重新安排作业,以便在他们开始运行而不是完成时再次运行。)