首页 > 解决方案 > 运行定期(主要)任务并提供 REST 接口的 Perl 脚本

问题描述

我正在研究一个 Perl 脚本,它根据文件系统内容进行一些定期处理。整体结构是这样的:

# ... initialization...

while(1) {
    # ... scan filesystem, perform actions depending on changes detected ...
    sleep 5;
}

我想通过通过 HTTP 公开接口来添加将一些数据输入到这个过程中的能力。例如,我想添加一个端点来跳过睡眠,但也想添加一些方法来输入在下一次迭代中处理的数据。另外,我希望能够通过 HTTP 查询一些程序的状态(即一个简单的fork()在单独的进程中简单地运行 webserver-part 是不够的?)

到目前为止,我已经使用过Dancer2一次该框架,但它有一个start;阻塞的调用,因此不允许任何其他任务(如我的循环)运行。此外,我当然可以将当前在循环内的代码移动到通过暴露的端点,Dancer2但是我需要定期调用它(虽然是外部程序?)与仅拥有网络服务器相比,这似乎是一个相当模糊的间接方式- 部分在后台运行。

是否可以不显眼地(即不阻塞程序)将 REST 服务器功能添加到 Perl 脚本?如果是:哪些模块将用于此目的?如果不是:我真的应该实现一个外部流程来定期调用某个端点还是完全追求不同的解决方案?

(我尝试添加dancer2标签,但由于声誉不足而无法添加。不要被此误导:到目前为止我只尝试过Dancer2没有Dancer(v.1))

标签: restperlsoftware-designmultitaskingdancer

解决方案


您可以尝试在后台线程中启动处理循环,然后再运行start;.

man perlthrtut

您可能想要use threads::shared;声明一些在 REST 部分和后台线程之间共享的变量。或使用专用队列/事件机制。


推荐阅读