进程和线程的本质区别

前几天有个同学问我,为什么electron是多进程而不是多线程?今天总结一下,对这个问题做下解答。

首先我们先了解下进程的概念:进程是计算机分配资源的最小单位

简单地说,进程是一个容器。比如一间漂亮的小别墅,别墅里有卧室、厨房、书房、洗手间等,当然还有一家三口住在里面。当妈妈带女儿外出游玩时,爸爸一个人在家。这时爸爸一个人在家里爱去哪里就去哪里、爱干什么就干什么,这时爸爸就像一个线程(这个进程中只有一个活动线程),小别墅就像一个进程,家里的厨房、书房就像这个进程占有的资源。当三个人住在一起时(相当于三个线程),有时候可能就会有些小冲突,比如,当女儿占着电视机看动画片时,爸爸就不能看体育频道了,这就是线程间的资源竞争。当然,大部分时候,线程之间是协作关系(如果我们创建线程是用来打架的,那么创建它干什么呢?)。比如,妈妈在厨房为爸爸和女儿做饭,爸爸在书房工作赚钱以养家糊口,女儿在写作业,各司其职,那么这个家就其乐融融。相应地,这个进程也就在健康地执行。

在电脑上如何看进程呢?

线程:是程序执行的最小单位
打开任务管理器
在这里插入图片描述
程序是死的,进程是“活”的,或者说是正在被执行的

如何创建一个进程

nodejs创建子进程主要有4个函数:

spawnexecexecFilefork

感兴趣看我这篇文章:https://blog.csdn.net/woyebuzhidao321/article/details/129567942

在电脑上如何看线程呢?

进程中可以容纳若干线程。它们并不是看不见、摸不着的,如下图示。

在这里插入图片描述
可以看到一个进程里面是包含了若干个线程的。

用稍微专业点的术语说,线程就是轻量级进程,是程序执行的最小单位。使用多线程而不是多进程去进行并发程序的设计,是因为线程的切换和调度的成本远远小于进程。

如何创建一个线程

在 Node.js 中,可以通过 Worker 对象来创建自己的线程对象。Worker 是 Node.js 的内置模块,它提供了一种简单的方式来创建独立的 JavaScript 线程。下面是一个简单的示例:

const {
    
     Worker } = require('worker_threads');

// 创建新的线程
const worker = new Worker('./worker.js', {
    
     workerData: {
    
     message: 'hello' } });

// 监听线程消息
worker.on('message', (message) => {
    
    
  console.log(`Received message from worker: ${
      
      message}`);
});

// 监听线程错误
worker.on('error', (error) => {
    
    
  console.error(`Error in worker: ${
      
      error}`);
});

// 监听线程退出事件
worker.on('exit', (code) => {
    
    
  console.log(`Worker exited with code ${
      
      code}`);
});

上述示例中,通过 Worker 对象创建了一个新的线程,使用 workerData 选项向线程传递了一个消息。线程文件 worker.js 可以通过workerData属性来获取传递的消息,并在需要时向主线程发送消息。在主线程中,可以监听线程的消息、错误和退出事件,并根据需要做出相应的处理。在线程文件 worker.js 中,可以通过 parentPort 对象来与主线程通信。例如:

const {
    
     parentPort, workerData } = require('worker_threads');

console.log(`Received message in worker: ${
      
      workerData.message}`);

// 向主线程发送消息
parentPort.postMessage('world');

上述代码中,使用 workerData 属性获取传递的消息,并在控制台输出。然后使用 postMessage 方法向主线程发送消息。需要注意的是,Node.js 的 Worker 对象使用的是基于线程的实现,而不是基于进程的实现。因此,创建的线程是运行在同一个进程中的,不同线程之间共享同一份内存。在多线程编程中,需要注意线程安全和共享资源的问题,以避免潜在的并发问题。

为什么electron是多进程而不是多线程

采用多进程而不是多线程的主要原因是安全性和稳定性。在多线程的情况下,一个线程的崩溃可能会导致整个应用程序崩溃而在多进程的情况下,一个进程的崩溃只会影响到该进程,不会影响到其他进程,从而提高了应用程序的稳定性。
此外,Electron采用多进程还可以实现更好的资源管理和分配。每个进程都有自己的内存空间和 CPU 时间,可以更好地利用系统资源,提高应用程序的性能。
最后,多进程还可以实现更好的安全性。每个进程都有自己的沙箱环境,可以防止恶意代码对整个应用程序的攻击和破坏。
因此,虽然多线程在某些情况下可能更加高效,但在安全性和稳定性方面,多进程是更好的选择。

如果文章中哪里写的有问题欢迎兄弟萌指正

猜你喜欢

转载自blog.csdn.net/woyebuzhidao321/article/details/131676125