Как создать новый процесс в Js?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как создать новый процесс в JS?
В JavaScript создание процессов возможно только в Node.js, так как в браузере нет доступа к операционной системе. Node.js предоставляет модуль child_process для создания дочерних процессов.
Методы создания процессов
1. spawn() — потоковое выполнение
Для выполнения больших объёмов данных с использованием потоков:
const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', (data) => {
console.log(`Output: ${data}`);
});
ls.stderr.on('data', (data) => {
console.error(`Error: ${data}`);
});
ls.on('close', (code) => {
console.log(`Process exited with code ${code}`);
});
Плюсы:
- Потоковая обработка
- Низкое использование памяти
- Для больших данных
Минусы:
- Обработка потоков усложнена
2. exec() — простое выполнение команд
Для простых команд оболочки:
const { exec } = require('child_process');
exec('ls -la', (error, stdout, stderr) => {
if (error) {
console.error(`Error: ${error.message}`);
return;
}
if (stderr) {
console.error(`stderr: ${stderr}`);
return;
}
console.log(`Output: ${stdout}`);
});
Плюсы:
- Простой синтаксис
- Вся информация в одном месте
Минусы:
- Весь вывод в памяти
- Не подходит для больших данных
3. execFile() — выполнение файла
Для выполнения конкретного файла без оболочки:
const { execFile } = require('child_process');
execFile('node', ['script.js'], (error, stdout, stderr) => {
if (error) throw error;
console.log(stdout);
});
4. fork() — создание Node.js процесса
Для создания нового Node.js процесса с IPC каналом:
const { fork } = require('child_process');
const child = fork('child.js');
// Отправка сообщения дочернему процессу
child.send({ hello: 'world' });
// Получение сообщения от дочернего процесса
child.on('message', (msg) => {
console.log('Message from child:', msg);
});
// Обработка завершения
child.on('close', (code) => {
console.log('Child exited with code', code);
});
child.js:
// Получение сообщения от родителя
process.on('message', (msg) => {
console.log('Message from parent:', msg);
// Отправка сообщения обратно
process.send({ hello: 'parent' });
});
Promisify для async/await
const { exec } = require('child_process');
const util = require('util');
const execPromise = util.promisify(exec);
async function runCommand() {
try {
const { stdout, stderr } = await execPromise('ls -la');
console.log('Output:', stdout);
} catch (error) {
console.error('Error:', error);
}
}
runCommand();
Выполнение скриптов
const { exec } = require('child_process');
// Выполнение Python скрипта
exec('python script.py', (error, stdout, stderr) => {
if (error) {
console.error('Error:', error);
return;
}
console.log('Output:', stdout);
});
// Выполнение bash команды
exec('echo "Hello from bash"', (error, stdout) => {
console.log(stdout);
});
Обработка ошибок
const { spawn } = require('child_process');
const child = spawn('nonexistent-command');
child.on('error', (error) => {
console.error('Failed to start child process:', error);
});
child.on('close', (code) => {
if (code !== 0) {
console.log('Process exited with error code:', code);
}
});
Таблица сравнения
| Метод | Использование | Память | Скорость |
|---|---|---|---|
| spawn() | Большие объёмы данных | Низкое | Быстро |
| exec() | Простые команды | Высокое | Нормально |
| execFile() | Файлы без оболочки | Среднее | Быстро |
| fork() | Мультипроцессинг Node.js | Среднее | Зависит |
Best Practices
- Используй spawn() для больших данных
- Используй exec() для простых команд
- Используй fork() для распределённых вычислений
- Всегда обрабатывай ошибки
- Очищай процессы при завершении
- Избегай shell injection — передавай аргументы массивом
Безопасность
// ❌ Опасно — возможен shell injection
exec(`ls ${userInput}`);
// ✅ Безопасно
spawn('ls', [userInput]);
Заключение
Для создания процессов в Node.js используй child_process. Выбирай метод в зависимости от задачи: spawn() для потоков, exec() для простых команд, fork() для IPC. Всегда обрабатывай ошибки и очищай ресурсы.