使用节点并行执行定时功能的最佳方式?
Most optimal way to execute timed functions in parallel using node?
我正在尝试创建一个可以并行执行任务的定时调度程序。例如:
假设我正在尝试创建一个函数,该函数将在调用 10 秒后执行某些操作。调用 Process_1()
后,预计会在 10 秒后 运行 实现预期功能。
但是在第 5 秒时,Process_1()
正在等待中途执行,我现在正在中途调用 Process_2()
。因此,在 10 秒标记处,Process_1()
将执行其功能,而在 15 秒标记处,Process_2()
将执行其功能。
我试过为此使用 node-cron,但它似乎无法并行安排事情。提前致谢!
Nodejs 运行 在单个线程中提供你的 Javascript 除非你明确地创建一个 WorkerThread 和 运行 一些代码。两个作业都是 运行 使用 CPU 的代码的真正并行执行只有在您 运行 WorkerThread 或子进程中的每个任务以将其从主线程中取出时才能完成.
让我重复一遍,真正的并行执行在 nodejs 中需要多个线程或进程,而 nodejs 默认情况下不会这样做,因此您必须创建一个 WorkerThread 或 child_process。
因此,如果您的代码需要几毫秒以上的时间才能完成工作,并且您希望它在相当精确的时间 运行,那么您不能指望主要 Javascript 线程来做那件事,因为它可能在那个精确的时间很忙。 Javascript 中的计时器将 运行 您的代码不早于预定时间,并且当预定时间到来时,事件循环已准备好 运行 它们,但它们实际上不会 运行 直到 运行ning 完成之前 returns 控制权返回事件循环,这样事件循环就可以 运行 代码附加到您的计时器。
所以,如果你主要做的是 I/O 种工作(reading/writing 文件或网络),那么你的实际 Javascript 执行时间可能只有几毫秒和 nodejs可以对 运行 您的计时器非常接近“准时”非常敏感。但是,如果你有计算量大的东西让 CPU 忙碌更长时间,那么如果你 运行 CPU-heavy 主线程中的内容。
您可以做的是启动一个 WorkerThread,在 WorkerThread 中设置计时器,然后 运行 在工作线程中编写您的代码。只要你不要求 WorkerThread 运行 任何其他东西,它应该准备好 运行 那个计时器几乎“准时”。
现在 WorkerThreads 确实与主线程共享一些资源,因此它们不是 100% 独立的(尽管它们接近于独立)。如果你想要 100% 的独立性,那么你可以启动一个 nodejs 子进程,它 运行 是一个节点脚本,设置它自己的计时器并且 运行 在另一个进程中它自己的工作。
综上所述,对于主要是 I/O 代码的代码,单线程模型在相当高的规模下工作得非常非常好,因为 nodejs 使用 non-blocking I/O 所以在等待时从文件或网络读取或写入,主线程是空闲的并且可用于 运行 其他事情。因此,它通常会呈现 运行 并行处理的现象,因为在多个方面都取得了进展。 nodejs 库中的 I/O 本身是本机 non-blocking(网络 I/O),或者发生在 OS-native 线程(文件 I/O)和编程接口中to Javascript 是基于回调或承诺的,所以它也是 non-blocking.
我之所以提到所有这些,是因为您没有说出您想要 运行 并行执行的两个操作是什么(包括您的实际代码可以让我们写出更完整的答案)。如果它们是 I/O 甚至一些加密,那么它们可能已经是 non-blocking 并且您可以实现所需的并行性而无需使用额外的线程或进程。
我正在尝试创建一个可以并行执行任务的定时调度程序。例如:
假设我正在尝试创建一个函数,该函数将在调用 10 秒后执行某些操作。调用 Process_1()
后,预计会在 10 秒后 运行 实现预期功能。
但是在第 5 秒时,Process_1()
正在等待中途执行,我现在正在中途调用 Process_2()
。因此,在 10 秒标记处,Process_1()
将执行其功能,而在 15 秒标记处,Process_2()
将执行其功能。
我试过为此使用 node-cron,但它似乎无法并行安排事情。提前致谢!
Nodejs 运行 在单个线程中提供你的 Javascript 除非你明确地创建一个 WorkerThread 和 运行 一些代码。两个作业都是 运行 使用 CPU 的代码的真正并行执行只有在您 运行 WorkerThread 或子进程中的每个任务以将其从主线程中取出时才能完成.
让我重复一遍,真正的并行执行在 nodejs 中需要多个线程或进程,而 nodejs 默认情况下不会这样做,因此您必须创建一个 WorkerThread 或 child_process。
因此,如果您的代码需要几毫秒以上的时间才能完成工作,并且您希望它在相当精确的时间 运行,那么您不能指望主要 Javascript 线程来做那件事,因为它可能在那个精确的时间很忙。 Javascript 中的计时器将 运行 您的代码不早于预定时间,并且当预定时间到来时,事件循环已准备好 运行 它们,但它们实际上不会 运行 直到 运行ning 完成之前 returns 控制权返回事件循环,这样事件循环就可以 运行 代码附加到您的计时器。
所以,如果你主要做的是 I/O 种工作(reading/writing 文件或网络),那么你的实际 Javascript 执行时间可能只有几毫秒和 nodejs可以对 运行 您的计时器非常接近“准时”非常敏感。但是,如果你有计算量大的东西让 CPU 忙碌更长时间,那么如果你 运行 CPU-heavy 主线程中的内容。
您可以做的是启动一个 WorkerThread,在 WorkerThread 中设置计时器,然后 运行 在工作线程中编写您的代码。只要你不要求 WorkerThread 运行 任何其他东西,它应该准备好 运行 那个计时器几乎“准时”。
现在 WorkerThreads 确实与主线程共享一些资源,因此它们不是 100% 独立的(尽管它们接近于独立)。如果你想要 100% 的独立性,那么你可以启动一个 nodejs 子进程,它 运行 是一个节点脚本,设置它自己的计时器并且 运行 在另一个进程中它自己的工作。
综上所述,对于主要是 I/O 代码的代码,单线程模型在相当高的规模下工作得非常非常好,因为 nodejs 使用 non-blocking I/O 所以在等待时从文件或网络读取或写入,主线程是空闲的并且可用于 运行 其他事情。因此,它通常会呈现 运行 并行处理的现象,因为在多个方面都取得了进展。 nodejs 库中的 I/O 本身是本机 non-blocking(网络 I/O),或者发生在 OS-native 线程(文件 I/O)和编程接口中to Javascript 是基于回调或承诺的,所以它也是 non-blocking.
我之所以提到所有这些,是因为您没有说出您想要 运行 并行执行的两个操作是什么(包括您的实际代码可以让我们写出更完整的答案)。如果它们是 I/O 甚至一些加密,那么它们可能已经是 non-blocking 并且您可以实现所需的并行性而无需使用额外的线程或进程。