Мазмунга өтүү

Сабактын башталышы

Жумушчу агымдар (Worker Threads)

Окуялар циклин тоскондобостон эсептөө жүгүн параллель аткаргыла

Негизги идея: Node сиздин JavaScript'ти бир башкы агымда аткарат. Бул кириш-чыгышка бай тапшырмалар үчүн эң сонун, бирок узак синхрондуу эсептөө баарын тосот -- эч бир суроо-талап тейленбейт, эч бир таймер иштебейт -- ал бүткөнчө. worker_threads модулу ошол эсептөөнү өзүнүн окуялар цикли жана өзүнүн V8 изоляты бар өзүнчө агымга көчүрүүгө мүмкүндүк берет, ошондо башкы агым жооп берүүчү бойдон калат.
Аягында сиз төмөнкүлөрдү жасай аласыз:
  • эсептөө жумушу окуялар циклин эмне үчүн тосорун, ал эми кириш-чыгыш тоспосун түшүндүрүү;
  • Worker түзүп, postMessage / workerData аркылуу маалымат алмашуу;
  • буферлерди көчүрбөстөн жылдыруу үчүн өткөрүлүүчү объекттерди (transferable) колдонуу;
  • SharedArrayBuffer жана Atomics менен агымдардын ортосунда эстутумду бөлүшүү;
  • жумушчу агымдардын, cluster жана child_process ортосунан туура тандоо.

1. Окуялар циклине эмне үчүн жардам керек

Окуялар цикли кириш-чыгышта эч качан тосулбай Node'ду жооп берүүчү кылып сактарын сиз мурдатан билесиз: маалымат базасына суроо же файлды окуу ОСке (же libuv агымына) берилет, ал эми сиздин колбэгиңиз кийинчерээк аткарылат. Кыйынчылык мында: сиздин JavaScript'иңиз өзү дагы эле бир агымда аткарылат. Эгер функция чоң баа коэффициенти менен сырсөздү хештөөгө 3 секунд, 40-мегапикселдик сүрөттүн өлчөмүн өзгөртүүгө же чоң CSV'ди талдоого убакыт коротсо, ошол агымдагы башка эч нерсе ошол 3 секунд иштей албайт.

// This blocks the whole process for as long as it runs
function fib(n) { return n < 2 ? n : fib(n - 1) + fib(n - 2); }
app.get('/slow', (req, res) => res.json({ result: fib(45) })); // ~seconds
// Every other request now waits behind this one CPU-bound call.

Маанилүү айырма: кириш-чыгыш менен чектелген жумуш (дискти, тармакты, сокеттерди күтүү) мурунтан эле параллель, себеби күтүү сиздин агымыңыздан тышкары жүрөт. Көйгөй -- процессор менен чектелген жумушта (таза эсептөө), себеби ал JavaScript аткарган жалгыз агымды монополиялайт. Аны setImmediate бөлүктөрүнө бөлүү кечигүүгө бир аз жардам берет, бирок реалдуу убакытты текке коротот жана түйшүктүү. Чыныгы чечим -- экинчи агым.

Салыштыруу. Башкы агым -- бул буйрутмаларды ашканага сонун берип, андан ары кете берген жалгыз кассир. Бирок кардар кассирден жеке өзү 20 мүнөттүк тамак жасоону сурап калса, бүт кезек токтойт. Жумушчу агым -- арткы бөлмөдөгү экинчи кассир: сиз ага буйрутманы бересиз, ал даярдайт, ал эми алдыңкы кассир калгандардын баарын тейлей берет.

Бул сабакты YourAIZone платформасында улантыңыз

Толук сабакта — толук түшүндүрмө, чыгарылган мисалдар, көп кездешкен каталар, заматта текшерилүүчү тесттер жана ЖИ-репетитор. Конок катары дароо баштаңыз же прогрессти сактоо үчүн аккаунт түзүңүз.

Толук сабакта

  • Толук түшүндүрмө
  • Чыгарылган мисалдар
  • Көп кездешкен каталар жана алардан кантип качуу керек
  • Тест суроолору: 15
  • Тема боюнча суроолорго жооп берген ЖИ-репетитор
  • Окуучу, ата-эне жана мугалим үчүн прогрессти көзөмөлдөө