Ricardo A Asked: 2020-03-03 19:07:50 +0800 CST 2020-03-03 19:07:50 +0800 CST 2020-03-03 19:07:50 +0800 CST 什么是多线程? 772 当我在学习 Node.js 中的事件循环时,我听到了“多线程”的定义,我真的不知道它们是什么意思,也不知道它们是什么意思。如果有人可以向我解释,我将不胜感激。首先,谢谢。 javascript 3 Answers Voted Trauma 2020-03-03T21:39:41+08:002020-03-03T21:39:41+08:00 在定义多线程之前,我们先来看看什么是程序。 程序是一组数据和函数;不多不少。在大多数语言中,数据是通过变量访问的。 反过来,变量可以是全局的(可以从程序中的任何地方访问),也可以是本地的(只能从定义它的函数中访问)。 线程或执行线程可以被认为是程序的特定执行点。在任何给定时间,线程只能执行某个代码语句;从那个特定点开始,我们可以访问所有全局变量,但只能访问我们所在函数的局部变量。 此外,线程还有其他相关的额外信息:当前调用堆栈(调用函数的信息),以及使用的参数。 单线程应用,比如 Nodejs,只有一个线程;在任何给定时间只有一个执行点。 另一方面,多线程应用程序在给定时间具有多个执行点。它仍然有一组全局变量,但它有多个函数同时执行,并且每个执行点都有自己的调用函数信息、自己的一组参数和自己的一组局部变量。 如果我们在超过 1 个 CPU的机器上运行多线程应用程序,该应用程序的性能将高于单线程应用程序;每个线程可以在一个 CPU 上执行,因此您一次可以执行多个任务。 如果我们只有 1 个 CPU,它将时间分配给所有正在执行的程序的所有线程,因此我们不会从使用多个线程中获得优势。 多线程应用程序的主要缺点是维护访问共享资源(例如全局变量)的顺序。专注于这些,可以从所有线程访问它们(与本地线程不同)。如果一个线程更改了一个全局变量,而另一个线程正在读取或写入它会发生什么?您可以查看经典的哲学家晚餐问题。 没有任何方法可以决定一个程序是使用一个线程还是多个线程更好。几乎所有问题都可以通过这两种方法中的任何一种来解决。多线程,理论上,你会得到更好的性能;使用线程,更加简单和易于工作。 同样,设计不佳的多线程程序可能比单线程程序慢。而且,对于某些任务(可以划分为工作块,彼此不依赖),使用多个线程可以提供更高的性能。 Best Answer Pablo Ezequiel Inchausti 2020-03-03T20:52:30+08:002020-03-03T20:52:30+08:00 简单地说,线程是执行的基本单位:当一个程序至少用一个线程(也称为“执行线程”)执行时,可以说是“单线程”。 单线程程序不进行并行/并发工作。同时执行多个任务(并行,并发)的一种方法是从程序生成新线程,例如 java 中的 new Thread() 指令创建将“并行”执行的新线程,然后我们有一个“多线程”环境,除了主程序的执行线程外,它启动的子线程也在运行。 在 Web 服务器的情况下,他们传统上会创建一个新线程来处理新的用户请求。如果有数千个用户请求,服务器会创建数千个线程来响应这些请求。 管理这么多线程对服务器来说不是免费的,线程有它们的生命周期、内存管理、同步问题等。此外,在线程内,执行周期是“阻塞的”(一条指令必须完成执行才能继续执行下一条指令)。 随着 NodeJS 的出现,人们寻求一种更高效的基于单线程事件循环的服务模型来满足所有用户的需求。为了“非阻塞”执行,“昂贵的”操作(例如输入/输出访问)与一个回调函数一起被记录下来,当输入/输出操作完成时服务器应该调用该回调函数。 由于这种策略,多线程 Web 服务器至少获得了两件事: a) 使用 I/O 操作和回调之间的时间,以便事件循环可以继续服务用户请求。b) 通过有一个简单的线程来处理所有用户请求,设置后资源的使用是恒定的。(不花费任何资源来创建/销毁/同步线程) 这是一个非常肤浅的答案,希望它无论如何都会有所帮助。 jony alton 2020-03-03T19:46:58+08:002020-03-03T19:46:58+08:00 多线程应用程序是具有多个独立并同时运行的子程序的应用程序。 在 Node.js 中,只有一个 JavaScript 执行线程。 在这里它更好地解释了它是如何工作 的 https://bytearcher.com/articles/why-in-nodejs-lot-of-asynchronous-operations/
在定义多线程之前,我们先来看看什么是程序。
程序是一组数据和函数;不多不少。在大多数语言中,数据是通过变量访问的。
反过来,变量可以是全局的(可以从程序中的任何地方访问),也可以是本地的(只能从定义它的函数中访问)。
线程或执行线程可以被认为是程序的特定执行点。在任何给定时间,线程只能执行某个代码语句;从那个特定点开始,我们可以访问所有全局变量,但只能访问我们所在函数的局部变量。
此外,线程还有其他相关的额外信息:当前调用堆栈(调用函数的信息),以及使用的参数。
单线程应用,比如 Nodejs,只有一个线程;在任何给定时间只有一个执行点。
另一方面,多线程应用程序在给定时间具有多个执行点。它仍然有一组全局变量,但它有多个函数同时执行,并且每个执行点都有自己的调用函数信息、自己的一组参数和自己的一组局部变量。
如果我们在超过 1 个 CPU的机器上运行多线程应用程序,该应用程序的性能将高于单线程应用程序;每个线程可以在一个 CPU 上执行,因此您一次可以执行多个任务。
如果我们只有 1 个 CPU,它将时间分配给所有正在执行的程序的所有线程,因此我们不会从使用多个线程中获得优势。
多线程应用程序的主要缺点是维护访问共享资源(例如全局变量)的顺序。专注于这些,可以从所有线程访问它们(与本地线程不同)。如果一个线程更改了一个全局变量,而另一个线程正在读取或写入它会发生什么?您可以查看经典的哲学家晚餐问题。
没有任何方法可以决定一个程序是使用一个线程还是多个线程更好。几乎所有问题都可以通过这两种方法中的任何一种来解决。多线程,理论上,你会得到更好的性能;使用线程,更加简单和易于工作。
同样,设计不佳的多线程程序可能比单线程程序慢。而且,对于某些任务(可以划分为工作块,彼此不依赖),使用多个线程可以提供更高的性能。
简单地说,线程是执行的基本单位:当一个程序至少用一个线程(也称为“执行线程”)执行时,可以说是“单线程”。
单线程程序不进行并行/并发工作。同时执行多个任务(并行,并发)的一种方法是从程序生成新线程,例如 java 中的 new Thread() 指令创建将“并行”执行的新线程,然后我们有一个“多线程”环境,除了主程序的执行线程外,它启动的子线程也在运行。
在 Web 服务器的情况下,他们传统上会创建一个新线程来处理新的用户请求。如果有数千个用户请求,服务器会创建数千个线程来响应这些请求。
管理这么多线程对服务器来说不是免费的,线程有它们的生命周期、内存管理、同步问题等。此外,在线程内,执行周期是“阻塞的”(一条指令必须完成执行才能继续执行下一条指令)。
随着 NodeJS 的出现,人们寻求一种更高效的基于单线程事件循环的服务模型来满足所有用户的需求。为了“非阻塞”执行,“昂贵的”操作(例如输入/输出访问)与一个回调函数一起被记录下来,当输入/输出操作完成时服务器应该调用该回调函数。
由于这种策略,多线程 Web 服务器至少获得了两件事: a) 使用 I/O 操作和回调之间的时间,以便事件循环可以继续服务用户请求。b) 通过有一个简单的线程来处理所有用户请求,设置后资源的使用是恒定的。(不花费任何资源来创建/销毁/同步线程)
这是一个非常肤浅的答案,希望它无论如何都会有所帮助。
多线程应用程序是具有多个独立并同时运行的子程序的应用程序。
在 Node.js 中,只有一个 JavaScript 执行线程。
在这里它更好地解释了它是如何工作 的 https://bytearcher.com/articles/why-in-nodejs-lot-of-asynchronous-operations/