工作线程如何在Nodejs中工作?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工作线程如何在Nodejs中工作?相关的知识,希望对你有一定的参考价值。

Nodejs不能具有Java和.net之类的内置线程API做。如果添加线程,则语言本身的性质将更改。无法将线程添加为一组新的可用线程类或函数。

Nodejs 10.x作为实验添加了工作线程,现在从12.x开始稳定。我浏览了一些博客,但由于缺乏知识,所以了解得不多。它们与线程有何不同。

答案

javascript中的工作线程在某种程度上类似于浏览器中的WebWorkers。它们不与主线程或彼此共享对任何变量的直接访问,并且它们与主线程通信的唯一方法是通过消息传递。此消息传递通过事件循环进行同步。这避免了多个线程试图访问相同变量的所有经典竞争条件,因为两个单独的线程无法访问node.js中的相同变量。每个线程都有其自己的变量集,影响另一个线程变量的唯一方法是向其发送消息并要求其修改自己的变量。由于该消息是通过该线程的事件队列同步的,因此在访问变量时没有经典竞争条件的风险。

另一方面,Java线程类似于C ++或本机线程,因为它们共享对相同变量的访问,并且线程被自由分时,因此恰好在线程A中运行的functionA中,执行可能会中断,而functionB正在运行在threadB中可以运行。由于两者都可以自由访问相同的变量,因此除非您手动使用线程同步工具(例如互斥锁)来协调和保护对共享变量的所有访问,否则就有各种竞争条件的可能。这种类型的编程通常是很难找到的来源,并且很难可靠地重现并发错误。尽管对于某些系统级的东西或更多实时代码而言功能强大且有用,但对于非常资深和经验丰富的开发人员而言,任何人都很容易犯下代价高昂的并发错误。而且,很难设计出一个测试来告诉您它在所有负载类型下是否真的稳定。

node.js试图通过将线程划分到它们自己的变量空间中,并迫使它们之间的所有通信通过事件队列进行同步来避免经典的并发错误。这意味着threadA / functionA绝不会被任意中断,并且进程中的其他一些代码会在不查找时更改它正在访问的某些共享变量。

node.js还有一个后盾,它可以运行可以用任何语言编写的child_process,并且可以在需要时使用本机线程,或者可以使用add-实际上将本机代码和实际系统级线程直接挂接到node.js中。在SDK上(它通过SDK接口与node.js Java脚本通信)。而且,实际上,许多node.js内置库正是为了做到这一点而浮出水面,而这些功能需要对nodejs环境进行这种级别的访问。例如,文件访问的实现使用本地线程池来执行文件操作。


因此,尽管如此,仍然可能发生某些类型的竞争条件,这与访问外部资源有关。例如,如果两个线程或进程都在尝试做自己的事情并写入同一文件,则它们显然会彼此冲突并产生问题。

因此,在访问外部资源时,在node.js中使用Workers仍必须注意并发问题。 node.js保护每个Worker的局部变量环境,但不能对外部资源之间的争用做任何事情。在这方面,node.js Worker具有与Java线程相同的问题,程序员必须为此编写代码(专有文件访问,文件锁,每个Worker的单独文件,使用数据库来管理存储的并发性,等等。) 。)。

以上是关于工作线程如何在Nodejs中工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 ipywidgets 在 Jupyter Lab 中工作?

单线程非阻塞 IO 模型如何在 Node.js 中工作

如何让 QThreads 在控制台 PySide 程序中工作?

异步编程如何在单线程编程模型中工作?

如何在 UI 线程中工作时更新进度条

malloc 如何在多线程环境中工作?