繁体   English   中英

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

[英]python long running daemon job processor

我想编写一个长期运行的进程(Linux守护程序),该进程有两个作用:

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

我本来是将其作为一个简单的程序运行的,该程序可以运行并执行我随后进行的更新,但是现在我有了REST要求,并且还想更改某些作业的频率,但不更改其他作业的频率(假设所有工作都有不同的频率)。

我有0个编写长期运行的流程的经验,尤其是那些自行完成而不是响应请求的流程。

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

我想知道是否存在任何模式,特别是python(我看过但还没有找到我想要做的事的任何示例),或者是否有人对从哪里开始过渡我的项目来满足这些建议有任何建议新的要求。 我看过一些涉及日程安排的项目,但我确实在这里寻找真实的用户体验/建议。 什么对您有效/不起作用?

  • 如果REST服务器和计划的作业没有共同之处,请执行两个单独的实现,即REST服务器和作业,然后将它们作为单独的进程运行。

  • 如前所述,请查看现有计划程序中的工作内容。 我不知道Twisted是否可以替代,但您可能要检查此平台。

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

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

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

并让它完成一个长期运行的处理请求的流程。 (我建议使用Spawning 。)您的代码可以专注于REST API并通过定义良好的WSGI接口处理请求,并安排作业。

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

这就是我们所做的。

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

    • 开始工作

    • 报告工作状态

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

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

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

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

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

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

您可以使用cron @reboot计划REST服务的启动

@reboot (cd /path/to/my/app && nohup python myserver.py&)

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

  • 维护计划的作业列表,按下一次运行时间排序(作为日期时间值);
  • 唤醒后,将列表中的第一个作业与当前时间进行比较。 如果到期或过期,请将其从列表中删除并运行。 继续以这种方式遍历列表,直到尚未完成第一份工作,然后入睡(next_job_due_date-current_time);
  • 作业完成运行后,请根据需要重新安排时间;
  • 将作业添加到计划后,请唤醒计划程序进程。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM