【问题标题】:NodeJS Semaphore module: how does it work?NodeJS 信号量模块:它是如何工作的?
【发布时间】:2016-07-23 22:43:42
【问题描述】:

所以我在这里使用我对 nodeJS 应用程序的 CRON 调用。目前不能保证我的脚本不会在给定时刻运行多次;我希望脚本在它已经运行时结束。

Semaphores 是常用的方法。由于我对NodeJS 还很陌生,因此如果可能的话,我想为此研究和实现一个现有模块。

于是我找到了semaphore for node,这似乎是最流行的node 预制解决方案。但是文档极其稀少,研究代码让我头疼:

https://github.com/abrkn/semaphore.js/blob/master/lib/semaphore.js

我认为模块会使用某种文件来了解进程是否已经在运行,但是它使用global 来存储该信息。那个怎么样?这肯定会阻止两个子脚本在单个 CRON 调用中同时运行,但这不会阻止对 CRON 的两个不同调用执行,不是吗?

或者global 是否有可能在所有正在运行的 NodeJS 任务之间共享?

编辑:

我必须明确指出,这个应用程序不是 HTTP 应用程序,它只是 CRONed 脚本的集合。所以也许这个信号量模块甚至不是正确的方向,因为它显然应该与createServer()一起使用。

【问题讨论】:

  • 我会为此使用普通的旧 pid 文件。
  • 在示例中:看起来信号量模块会阻止另一个请求的输入,而在处理一些昂贵的任务时,看起来它不会阻止事件循环。也许在你的情况下你需要另一个模块。
  • 你为什么要使用带有节点的 cron 呢?您可以简单地使用setTimeout 并将您的脚本编码为仅依赖于node.js,它会安排它们的执行。

标签: javascript node.js cron semaphore


【解决方案1】:

您可以使用flock 命令来锁定对资源的同时访问,例如:

* * * * * /usr/bin/flock -w 0 /path/to/cron.lock /usr/bin/node /path/to/script.js

flock 启动的那一刻,它会锁定您在命令中指定的锁定文件。因此,通过使用额外的命令行工具,flock 是防止 cronjobs 重叠的一个很好的方法。

有一个很好的解释:你的手册页或http://man7.org/linux/man-pages/man2/flock.2.html

【讨论】:

  • 这正是我所需要的!非常感谢。
  • 我有一个附属问题:当任务结束时,*.lock 文件仍然存在,这正常吗?尽管如此,flock 按预期工作。
猜你喜欢
  • 2010-11-16
  • 1970-01-01
  • 2015-07-17
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 2015-04-07
  • 2011-05-30
  • 2021-04-17
相关资源
最近更新 更多