Skip to content

进程和线程

🕒 Published at:

进程

定义

进程(process)是系统进行资源分配和资源调度的一个基本单位。进程是线程的容器。

每一个进程都有它自己的地址空间

浏览器环境通过JS应该不能手动控制创建新的进程,Node.js环境通过内置模块child_process来实现创建新的进程

进程通信

进程通信:就是指进程之间的信息交换。

各个进程拥有的内存地址空间相互独立,为了保证线程安全,操作系统中规定一个进程不能直接访问另一个进程的地址空间。

进程通信的方式主要分为三种:共享存储,消息传递,管道通信。

Node.js环境创建新的进程的方法

主要通过内置模块child_process来实现

spawn

js
// exec,execFile和fork创建新的子进程都是基于这个方法进行的封装
import { spawn } from "child_process";
const ls = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

ls.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});

exec

js
// exec方法用于异步创建一个新的子进程,可以接受一个callback。
import { exec } from 'child_process'
exec('git -v', (err, stdout, stderr) => {
  console.log('err::: ', err);
  console.log('stdout::: ', stdout);
  console.log('stderr::: ', stderr);
})

execFile

js
// 指定的可执行的文件直接创建一个新的进程,而不是直接衍生一个shell
import { execFile } from 'child_process'
execFile('node', ['--version'], (err, stdout, stderr) => {
  console.log(stdout)
})

fork

js
// parent.js
import { fork } from 'child_process'
import path from 'path'
import os from 'os'

function getDirname(url) {
  if (os.platform() === 'win32') {
    return path.dirname(decodeURI(url).slice(8).replace(/\//g, '\\'))
  } else {
    return path.dirname(decodeURI(url).slice(7))
  }
}
const __dirname = getDirname(import.meta.url)
const pathname = path.resolve(__dirname, './sub.js')
const fd = fork(pathname)

fd.on('data', (data) => console.log(data))

// sub.js
console.log('this is sub process')

spawnSync

js
import { spawnSync } from "child_process";
const stdout = spawnSync('ls', ['-lh', '/usr']);
console.log(stdout.stdout.toString())

execSync

js
import { execSync } from "child_process";

const stdout = execSync('git -v')
console.log(stdout.toString())

execFileSync

js
import { execFileSync } from "child_process";

const stdout = execFileSync('node', ['--version'])
console.log(stdout.toString())

线程

线程(thread)是操作系统能够进行运算调度的最小单位。

线程是独立运行和独立调度的基本单位

线程可以并发执行,可以共享进程资源

浏览器环境使用Worker方法来创建新的线程

Node.js环境使用内置模块worker_threads来创建新的线程