进程
定义
进程(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来创建新的线程