Blockerande vs icke-blockerande filskrivning i NodeJS

Ursprungligen skrivet här ->Ta gärna en titt.
https://easyontheweb.com/blocking-vs-non-blocking-file-write-in-nodejs/

Om du nyligen har börjat arbeta med NodeJS kanske du har hört talas om blockerande och icke-blockerande kod i nodeJS. När jag bytte från Ruby on Rails till NodeJS var det ett av koncepten som verkade väldigt annorlunda för mig. Att direkt skriva löften eller återuppringningar är verkligen inte rätt väg att gå för att lära sig om blockerande och icke-blockerande kod i NodeJS.

Så i den här artikeln tar vi de enklaste exemplen på att skriva till och läsa från filer i NodeJS och förstå hur blockerande och icke-blockerande kod fungerar i NodeJS.

Varför blockerande och icke-blockerande
Vi ska inte gå in för mycket på djupet i den här artikeln om trådar och hur Node fungerar under huven, men för att förstå konceptet med blockerande och icke-blockerande kod bör du bara veta en sak – Node är entrådig, dvs. endast en process kan köras på den åt gången. Till exempel, du skriver en bit kod för 5 användare att interagera med, rad 8 i din kod tar säg 2 sekunder att exekvera. Om en användare A träffar rad 8 i koden under sin processexekvering och samtidigt en användare B också försöker köra samma program, kommer den rad 8 att blockera exekveringen av användare B:s program också.

En bit kod som blockerar exekveringen av någon annan kod bortom den tills den själv exekveras är vad vi kallar blockeringskod. Den här blockeringskoden kan vara vad som helst – läsning från en DB, någon komplex matematisk operation, någon I/O-operation, vad som helst.

Det som är viktigt är att veta att blockeringskod inte är bra kod i NodeJS. Vi vill inte stoppa andra användare för någon kod som någon annan kör. Nu, i vissa superedge fall kanske du specifikt vill skriva blockeringskod, men vanligtvis är det inte vad vi vill och vad vi siktar på. Låt oss nu se med denna filläs-skrivoperation hur blockerande och icke-blockerande kod fungerar i NodeJS.

Blockerande sätt
Blockeringssättet även kallat det synkrona sättet är ett där koden exekveras rad för rad, dvs koden på nästa rad kommer inte att exekveras förrän koden på föregående rad har avslutats.

I den här metoden använder vi den inbyggda funktionen i fs-modulen som heter readFileSync för att läsa innehållet i en fil som heter mytext.txt och lagra den i variabeln som heter inputText. Senare skriver vi det innehållet plus en extra rad till en fil som heter outputfile.txt .

Funktionerna readFileSync och writeFileSync som namnen antyder är synkrona funktioner, dvs dessa är blockeringskod. Vad detta betyder är att om filen vi läser är superstor och tar 5 sekunder så kommer någon kod före den inte att exekveras under dessa 5 sekunder, faktiskt ingen kod i denna nodprocess skulle exekveras under dessa 5 sekunder.

Se den här nya koden, ja den är ny 😛 . Jag har ändrat den nya texten som vi skriver här till en annan oberoende av inputText. Nu, här är vi inte beroende av värdet av inputText för att skriva till outputfile.txt . Men eftersom den här koden blockerar kommer vi inte att kunna skriva innan läsprocessen är över. Du kan kontrollera det genom att konsollogga värdet för inputText precis innan skrivoperationen! Den kommer att finnas där.

Icke-blockerande sätt

Detta å andra sidan är en icke-blockerande kod. Ja, jag har använt återuppringningar eftersom de förstås av majoriteten och även de som fortfarande inte har exponerats för async/väntar.

I den här funktionen kommer du att märka att skrivningen av filen outputfile2.txt är helt oberoende av utförandet av läsningen av myText.txt. Eftersom funktionen readFile är en asynkron, kommer den inte att stoppa exekveringen av någon annan kod och kommer tyst att fortsätta köras i bakgrunden utan att blockera någonting. Det är att notera att den enda koden som väntar på att exekveras är den i dens återuppringning och det beror på att vi måste ställa in värdet på inputText innan vi skriver det till outputfile.txt.

Om du konsolloggar värdet för inputText precis ovanför den andra skrivfilen i den här kodbiten ser du att det är null. Varför ? Eftersom vi inte har väntat på att läsningen ska slutföras och har skrivit in nästa kodrad direkt.

Jag hoppas att du lärde dig något i den här artikeln och för att kolla in 5 fantastiska fakta om JS som du förmodligen inte visste, kolla in den här artikeln av mig -> https://easyontheweb.com/5-javascript-facts-you- förmodligen-visste-inte/