Blokuojantis I/O sustabdo iškviečiančią giją, kol operacija baigiasi; neblokuojantis I/O grįžta iškart ir leidžia gijai atlikti kitą darbą, kol operacija užbaigiama. Sinchroninis prieš asinchroninį apibūdina tą pačią idėją API lygmenyje.
Blokuojantis I/O sustabdo iškviečiančią giją, kol operacija baigiasi; neblokuojantis I/O grįžta iškart ir leidžia gijai atlikti kitą darbą, kol operacija užbaigiama. Sinchroninis prieš asinchroninį apibūdina tą pačią idėją API lygmenyje.
read(), kol atkeliauja duomenys. Paprasta, bet gija yra neveikli visą tą laiką — kad aptarnautumėte N lėtų klientų, jums reikia N gijų.Blocking: ──[ wait for disk ]── (thread stuck, does nothing)
Non-blocking: ──▶ returns now; event loop notified when ready
// Blocking: nothing else runs until the file is read
const data = fs.readFileSync('big.txt');
// Non-blocking: thread keeps going; callback fires later
fs.readFile('big.txt', (err, data) => { /* handle later */ });
// or async/await on top of non-blocking primitives
const data2 = await fs.promises.readFile('big.txt');
Tai yra mastelėjamų serverių esmė. Node.js ir nginx tvarko milžiniškus jungčių skaičius ant kelių gijų būtent todėl, kad I/O yra neblokuojantis — laukimas nesuriša gijos. Naudokite blokuojančius iškvietimus dėl paprastumo skriptuose; naudokite neblokuojantį didelio konkurentumo tinklo paslaugoms, ir niekada neblokuokite įvykių ciklo CPU intensyviu darbu.
IT pokalbių klausimų biblioteka su išsamiais atsakymais — nuo Junior iki Senior.
Paaukoti