Blocking I/O აჩერებს გამომძახებელ thread-ს, სანამ ოპერაცია არ დასრულდება; non-blocking I/O ბრუნდება მაშინვე და thread-ს საშუალებას აძლევს გააკეთოს სხვა სამუშაო, სანამ ოპერაცია სრულდება. Sync vs async აღწერს იმავე იდეას API დონეზე.
Blocking I/O აჩერებს გამომძახებელ thread-ს, სანამ ოპერაცია არ დასრულდება; non-blocking I/O ბრუნდება მაშინვე და thread-ს საშუალებას აძლევს გააკეთოს სხვა სამუშაო, სანამ ოპერაცია სრულდება. Sync vs async აღწერს იმავე იდეას API დონეზე.
read()-ზე, სანამ მონაცემები არ მოვა. მარტივია, მაგრამ thread მთელი ამ დროის განმავლობაში უსაქმურია — N ნელი კლიენტის მოსამსახურებლად გჭირდებათ N thread.Blocking: ──[ wait for disk ]── (thread გაჩერებულია, არაფერს აკეთებს)
Non-blocking: ──▶ ბრუნდება ახლა; event loop ეცნობება, როცა მზადაა
// Blocking: სხვა არაფერი მუშაობს, სანამ ფაილი არ წაიკითხება
const data = fs.readFileSync('big.txt');
// Non-blocking: thread აგრძელებს; callback მოგვიანებით ისვრება
fs.readFile('big.txt', (err, data) => { /* handle later */ });
// ან async/await non-blocking primitive-ების თავზე
const data2 = await fs.promises.readFile('big.txt');
ეს არის მასშტაბირებადი server-ების არსი. Node.js და nginx უმკლავდებიან უზარმაზარ კავშირების რაოდენობებს რამდენიმე thread-ზე ზუსტად იმიტომ, რომ I/O არის non-blocking — ლოდინი არ იჭერს thread-ს. გამოიყენეთ blocking გამოძახებები სიმარტივისთვის სკრიპტებში; გამოიყენეთ non-blocking მაღალი თანადროულობის ქსელური სერვისებისთვის და არასდროს დაბლოკოთ event loop CPU-ზე მძიმე სამუშაოთი.
IT გასაუბრების კითხვების ბიბლიოთეკა დეტალური პასუხებით — Junior-დან Senior-მდე.
შემოწირულობა