具体来说,我使用flask创建了一个简单的Web应用,该应用使用APScheduler执行cron作业。但是,当我将代码与WSGI(uWSGI,gunicorn ...)打包在一起时,我注意到,由于WSGI倾向于将应用程序分叉到多个进程中,因此它的行为方式与开发环境中的运行方式不同(运行多次执行同一项工作,根本就不执行工作...)。
经过一些耗时的研究,阅读了docs之后,我提出了一些解决方案:
运行一个独立的进程,该进程将调度程序功能与某些远程访问机制(例如RPyC)打包在一起,并使flask进程与该进程进行对话以进行与调度相关的任何操作。
忘记调度程序,只需利用操作系统提供的cron命令
在WSGI Server启动时,一个工作进程将负责运行调度程序。如果还需要其他进程访问调度程序,请与运行服务器的进程进行对话。 (这是一个概念性的想法,我不确定是否可以做到这一点,或者:(
所以我的问题是:这怎么这么复杂?
无论编程语言,操作系统,部署堆栈等如何,我都可以肯定我不是需要与Web应用程序一起运行cron作业的少数人。但是,实际上,上述解决方案似乎都无法满足我的需求。
因为这是我第一次构建Web应用程序,所以我想知道其他编程语言,框架或堆栈是如何解决此问题的,或者调度工作只是不在应用程序范围之内而应该在其他地方要照顾好。
P.s。 在我看来,调度程序应该是...
与操作系统无关,不会在操作系统提供的界面/功能上使用,因此应用程序可移植,即可以在任何堆栈上运行。
简单堆叠,无需安装/启动/停止其他命令,在应用启动时运行,在应用停止时关闭。
在应用内绑定/处理。进一步设想2.,如果有任何停机时间,应用程序负责处理任何误操作。 (自从我上次检查以来,没有一个操作系统提供这种功能)