2

我想编写一个长时间运行的进程(linux daemon),它有两个目的:

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

我最初将它作为一个简单的程序运行,该程序将运行并执行我然后 cron'd 的更新,但现在我有添加的 REST 要求,并且还想更改某些作业的频率,但不更改其他作业的频率(假设所有工作都有不同的频率)。

我有 0 次编写长时间运行的流程的经验,尤其是那些自己做事而不是响应请求的流程。

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

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

4

5 回答 5

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

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

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

    • 将实际作业编写为 REST 服务器可以分叉和运行的程序。
    • 有一个单独的调度程序来处理作业的时间。
    • 如果作业即将运行,则让调度程序向本地服务器发出相应的 REST 请求。这样调度程序只处理作业描述,但不知道它们是如何实现的。
  • 对于长时间运行的高可用性进程来说,有一个额外的“主管”进程来检查必要的恶魔是否启动并运行,并在必要时重新启动它们,这是一个常见的特征。

于 2009-07-10T07:45:54.947 回答
1

这就是我们所做的。

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

    • 开始工作

    • 报告作业状态

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

    • socket 上的 Activity 是普通的 REST 请求,我们让 wsgiref 处理这个。它最终会调用我们的 WSGI 应用程序来响应状态并提交请求。

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

      • 检查所有正在跑步的孩子,看看他们是否完成了。更新他们的状态等。

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

于 2009-07-10T10:16:47.183 回答
1

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

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

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

于 2009-07-10T05:33:28.490 回答
0

我通常cron用于调度。至于 REST,您可以使用众多 Web 框架之一。但是仅仅运行 SimpleHTTPServer 就足够了。

cron您可以使用@reboot安排 REST 服务启动

@reboot (cd /path/to/my/app && nohup python myserver.py&)
于 2009-07-10T05:29:23.567 回答
0

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

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

根据您的情况进行调整(例如,有时您可能希望重新安排作业以在它们开始运行而不是结束时再次运行)。

于 2009-07-10T06:36:49.670 回答