console.log('hello world'), 1000) 会将函数放置到某个任务队列中运行。但如果它前面还有其他任务,它就不会精确地在 1-6ren">
gpt4 book ai didi

node.js - 如何在 "real world"时间内每 n 毫秒调用一个函数?

转载 作者:太空宇宙 更新时间:2023-11-03 22:43:15 25 4
gpt4 key购买 nike

如果我理解正确,setInterval(() => console.log('hello world'), 1000) 会将函数放置到某个任务队列中运行。但如果它前面还有其他任务,它就不会精确地在 1000 毫秒或每次都运行。

在一个复杂的程序中,是否可以使用 Node.js 在现实世界中每 n 毫秒精确地调用某个函数?

最佳答案

If I understand correctly, setInterval(() => console.log('hello world'), 1000) will place the function to some queue of tasks to run. But if there are other tasks in-front of it, it won't run exactly at 1000 millisecond or every time.

这是正确的。如果当计时器准备好运行时,node.js 恰好忙于做其他事情,那么它就不会准确地在所需的时间运行。 Node.js 将等待它完成其他任务,然后再运行计时器回调。您可以将 Node.js 视为单向思维(一次只能做一件事),并且计时器永远不会中断正在运行的现有任务。

In a single complex program, is it possible to also make calls to some function every n millisecond exactly in real world time with node.js ?

不,在 Node.js 中不可能做到这一点。 node.js 以单线程方式运行 Javascript,它是事件驱动的且非抢占式的。所有这些意味着您不能依赖在精确的现实时间运行的代码。

node.js 中发生的事情是为 future 的特定时间设置一个计时器。该计时器已在 node.js 事件循环中注册,以便每次通过事件循环时,它都会检查是否有任何待处理的计时器。但是,只有当计时器准备好触发之前运行的其他代码完成运行时,它才会通过事件循环。以下是事件的顺序:

  • 运行一些代码
  • 设置 future 某个时间的计时器(比如时间 X)
  • 运行更多代码
  • 暂时无事可做
  • 再运行一些代码(当此代码运行时,耗时 X - 计时器运行的时间)
  • 前面的代码块完成运行,控制权在时间 X + n(在计时器 X 应该触发后的某个时间)返回到 node.js 事件循环。
  • 事件循环检查是否有任何待处理的计时器。它找到一个计时器并在时间 X + n 处调用其回调。

所以,你的计时器在大约时间 X 被调用的唯一方法是,如果 Node.js 在时间 X 没有其他事情可做。如果你的程序在做其他事情,你不能保证你的程序会在时间 X 有空,可以在您希望计时器运行时准确地运行计时器。 Node.js 无论如何都不是一个实时系统。单线程和非抢占式意味着计时器可能必须等待 Node.js 完成其他一些事情才能运行,因此不能保证计时器会准时运行。相反,当解释器下次有空返回到事件循环时,它将像在时间 X 之前一样运行(完成运行当时可能正在运行的任何其他操作)。这可能接近时间 X,也可能是时间 X 之后的一段重要时间。

如果您确实需要在特定时间精确运行某些东西,那么您可能需要一个比 Node.js 更加实时的抢占式系统(不是 Node.js)。

<小时/>

您可以通过启动另一个node.js进程(您可以使用child_process模块​​)在node.js中创建一个“解决方法”,并在另一个进程中启动一个程序,该程序除了为您的计时器服务之外没有其他事情可做并执行与该计时器相关的代码。然后,至少你的计时器不会被其他可能正在运行的 Javascript 任务抢占,并且会在非常接近所需时间的情况下运行。请记住,即使这种解决方法仍然不是真正的实时系统,但可能有一些用途。

否则,您可能希望使用更实时的系统语言来编写此语言,该语言具有抢占式计时器(甚至可能具有线程优先级)。

关于node.js - 如何在 "real world"时间内每 n 毫秒调用一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53569180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com