Node.js child process: spawn, exec va fork farqi

Assalamu Alaykum bugun Nodejsdagi child process modulini u qanday ishlashini va bizga nima uchun kerakligini ko'rib chiqamiz .

Bu maqolani o'qishdan oldin ushbu maqolalarni o'qishni tavsiya qilaman.

  1. Unix qanday ishlaydi ?

2.Processlar orasidagi kommunikatsiya(IPC)

Child process o'zi nima ?

Child process bu boshqa bir process tomonidan ishga tushurilgan process bu hamma dasturlash tillarida mavjud.

Unixda yangi process yaratganda kernel yangi process unikal id beradi hamda parent processning ya'ni shu processni yaratgan processning idsi ham beriladi bu PPID bo'ladi. Bu id orqali siz parentga uni parentiga borishingiz mumkin agard u 0 bo'lsa u kernel bo'ladi.

Yangi process yaratish jarayoni

Agarda yangi process yaratishga buyruq bersangiz , siz unga executable(ishga tushursa bo'ladigan) fayl pathni va ba'zi argumentlar berishingiz mumkin va bu kernelga boradi. Kernel pathni xotiradan qidiradi va uni topib RAMga oladi va shu orqali yangi process ishga tushadi. Hamma processlar RAMda ishga tushadi.

Child process moduli

Tepada aytgan ishlarimizni amalga oshiradigan modul Nodejsda child_process deb nomlangan . Unda asosiy 3ta funksiya mavjuda bular spawn , fork va exec . Hozir bularning har biri nima vazifa bajarishi va uni misollarda ko'rib chiqamiz.

child process funksiyalari
child process funksiyalari

Spawn funksiyasi

Spawn funksiyasi orqali biz boshqa processlarni ishga tushura olamiz.

const {spawn} = require("node:child_process")
const subprocess = spawn("ls")
subprocess.stdout.on("data", (data) => {
  console.log(data.toString())
})

Bu xuddi ls buyrug'ini terminalda ishga tushurganimiz bilan bir xil . Nodejs process ls ishga tushuriladigan faylni ishga tushurib undan chiquvchi stream (stdout) da kelayotgan ma'lumotni terminalga yo'naltirmoqda.

Ammo biz bu yerda hamma buyruqlarni ishga tushura olmaymiz masalan ll yoki disown chunki bunaqa unix executable fayllar mavjud emas . Nodejs PATH orqali bu faylni topishga harakat qiladi(alias, funksiya va built-inlar hisobga olnimaydi) .

Exec funksiyasi

Exec funskiyasi biroz boshqacharoq u biz bergan buyruqni ishga tushuradi.

const { exec } = require('child_process');

exec('ls -l', (error, stdout, stderr) => {
  if (error) {
    console.error(`exec error: ${error}`);
    return;
  }
  console.log(`stdout:\n${stdout}`);
  console.error(`stderr:\n${stderr}`);
});

error bu agar Nodejs u faylni ishga tushura olmasa , stderr esa child process ishlayotgandagi errorlar streami. stdout esa processdan chiquvchi natijasi. Buning natijasi terminal ls-l buyrug'i natijasi bilan bir xil.

Fork funksiyasi

Fork funksiyasi bu boshqa bir js faylni ishga tushurgan nodejs processni yaratadi va unda avtomatik IPC kanallar ulangan bo'ladi.

const { fork } = require('child_process');

const child = fork('child.js');

child.on('message', (msg) => {
  console.log('Message from child', msg);
});

child.send({ hello: 'world' });
//child.js
process.on('message', (msg) => {
  console.log('Message from parent:', msg);
  process.send({ foo: 'bar' });
});

Tepada ko'rganingizdek fork yangi process yaratgan va 3761 idlik parent process esa 3760 va u fork.js ni ishga tushurgan.

Exec va Spawn farqi

exec da biz to'liq buyruqni bera olamiz , spawn da esa argumentlarni array sifatida berishimiz kerak. exec bizga to'liq natijani beradi , spawn esa stream orqali beradi va xotira muammosi kelib chiqmaydi . Ular orasidagi asosiy farq bu exec buyruqni oladi va uni shellda ishga tushuradi, spawn yangi process yartadi. exec bu shellni spawn orqali ochilgani deb misol qilishimiz mumkin.

Process ishga tushishiga aloqador ma'lumotlar

process.argv orqali processga berilgan barcha argumentlarni olishimiz mumkin. node just.js hello -f dsdsd dsds bularni hammasi argument sifatida processga o'tadi. Env variables(muhit o'zgaruvchilari) ham child processga o'tkaziladi . Pastdagi rasmdagi argumnetlar bu ishga tushuruvchi node executable fayl ishga tushishi kerak bo'lgan fayl va boshqa biz bergan argumentlardan iborat.

Kompyuterdagi dasturni ochib ko'ramiz

Hozir Macdan Trelloning executable faylni olib nodejs child process orqali ochib ko'ramiz.

const { spawn } = require("node:child_process");

const subprocess = spawn("/Applications/Trello.app/Contents/MacOS/Trello"); // absolute path to the trello app executable

subprocess.stdout.on("data", (data) => {
  console.log(data.toString());
});

Agarda parent process yopilsa u ochgan child process ham avtomatik tugatiladi ammo buni konfiguratsiya qilish mumkin.

Barcha kodlarni ushbu repodan topshingiz mumkin. Repo

Xulosa

Xulosa qilib aytadigan bo'lsak child process orqali biz xohlagan processni yaratib uni ishga tushurishimiz mumkin bu uchun bizga uning unix executable fayl kerak xolos. Bu orqali videoni olib video tahrirlovchi dastur orqali avtomatik hajmini kichraytish yoki sifatini oshirishingiz mumkin.

Agarda maqola yoqqan bo'lsa chapak chaling (ko'p chalsayam bo'ladi). Obuna bo'lishni unutmang ;)

Xato va kamchiliklar uchun uzr !!!

linkedin.com =>Ulug’bek Habibov | LinkedIn

telegram channel =>@habibov_ulugbek