San*_*tel 5 multithreading worker-thread node.js
Nodejs 不能像 java 和 .net 那样有内置的线程 API。如果添加线程,语言本身的性质将发生变化。不可能将线程添加为一组新的可用类或函数。
Nodejs 10.x 添加了工作线程作为实验,现在自 12.x 起稳定。我浏览了几篇博客,但可能由于缺乏知识而不太了解。它们与线程有何不同。
jfr*_*d00 12
Javascript 中的工作线程有点类似于浏览器中的 WebWorker。它们不与主线程或彼此共享对任何变量的直接访问,它们与主线程通信的唯一方式是通过消息传递。此消息传递通过事件循环进行同步。这避免了多个线程试图访问相同变量的所有经典竞争条件,因为两个单独的线程无法访问 node.js 中的相同变量。每个线程都有自己的一组变量,影响另一个线程变量的唯一方法是向它发送消息并要求它修改自己的变量。由于该消息通过该线程的事件队列进行同步,因此在访问变量时不存在经典竞争条件的风险。
另一方面,Java 线程类似于 C++ 或本机线程,因为它们共享对相同变量的访问,并且线程可以自由地按时间分片,因此就在线程 A 中运行的函数 A 的中间,执行可能会被中断,而函数 B 在线程 B 中运行可以运行。由于两者都可以自由访问相同的变量,因此除非手动使用线程同步工具(例如互斥锁)来协调和保护对共享变量的所有访问,否则可能存在各种竞争条件。这种类型的编程通常是很难找到并且几乎不可能可靠地重现并发错误的根源。虽然对于某些系统级事物或更实时的代码来说功能强大且有用,但对于非常资深和经验丰富的开发人员之外的任何人来说,犯下代价高昂的并发错误都很容易。而且,它'
node.js 试图通过将线程分离到它们自己的变量空间并强制它们之间的所有通信通过事件队列进行同步来避免经典的并发错误。这意味着 threadA/functionA 永远不会被任意中断,并且您的进程中的其他一些代码更改了它在不查找时正在访问的一些共享变量。
node.js 也有一个支持,它可以运行一个可以用任何语言编写的 child_process 并且可以在需要时使用本机线程,或者实际上可以使用附加 SDK 将本机代码和实际系统级线程直接挂接到 node.js (并且它通过 SDK 接口与 node.js Javascript 通信)。而且,事实上,许多 node.js 内置库正是这样做的,以显示需要对 nodejs 环境进行该级别访问的功能。例如,文件访问的实现使用本地线程池来执行文件操作。
因此,综上所述,仍然可能发生某些类型的竞争条件,这与对外部资源的访问有关。例如,如果两个线程或进程都试图做自己的事情并写入同一个文件,那么它们显然会相互冲突并产生问题。
所以,在node.js中使用Workers还是要注意访问外部资源的并发问题。node.js 为每个 Worker 保护了局部变量环境,但对外部资源的争用无能为力。在这方面,node.js Worker 与 Java 线程存在相同的问题,程序员必须为此编写代码(独占文件访问、文件锁定、每个 Worker 的单独文件、使用数据库管理存储的并发性等。) .)
| 归档时间: |
|
| 查看次数: |
1070 次 |
| 最近记录: |