Жумушчу агымдар (Worker Threads)
Окуялар циклин тоскондобостон эсептөө жүгүн параллель аткаргыла
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 мүнөттүк тамак жасоону сурап калса, бүт кезек токтойт. Жумушчу агым -- арткы бөлмөдөгү экинчи кассир: сиз ага буйрутманы бересиз, ал даярдайт, ал эми алдыңкы кассир калгандардын баарын тейлей берет.