Ako radite u razvoju aplikacija, znate da rješavanje zadataka koji zahtijevaju neko vrijeme za odgovor može biti prava glavobolja. Korutine ovdje dolaze do izražaja kao uzorak dizajna simultanosti Brutalno za pojednostavljenje asinhronog koda, sprječavajući zaglavljivanje glavne niti i suočavanje korisnika sa strašnim dijalogom "aplikacija ne reagira".
U osnovi, korutine možemo smatrati nitima, ali puno lakšim i učinkovitijim. Čarolija leži u činjenici da vam omogućuju izvršavanje više istovremenih zadataka u jednoj niti zahvaljujući suspenziji koja štedi memoriju i sprječava zamrzavanje korisničkog sučelja dok se čeka odgovor s mreže ili baze podataka.
Koncept funkcija suspenzije
Da bi sve ovo funkcioniralo, Kotlin koristi suspendirane funkcijeOve funkcije imaju mogućnost pauziranja izvršavanja korutine bez blokiranja niti koja je izvršava. Zamislite da je to kao pauziranje zadatka dok se čekaju tražene informacije; nakon što su podaci spremni, korutina nastavlja s izvršavanjem točno tamo gdje je stala.
Ove funkcije mogu se izvršiti samo unutar druge suspend funkcije ili unutar korutine. Za promjenu niti na kojoj se izvršava dio koda koristimo sKontekstomšto nam omogućuje skok, na primjer, s glavne niti na ulazno/izlaznu nit bez prekidanja logičkog slijeda programa.
Dispečeri i područja izvršenja
Nisu svi zadaci isti, stoga nam je potrebno dispečera reći korumpiranim dužnosnicima gdje bi trebali raditi. Imamo Glavni dispečer, idealno za interakciju s korisničkim sučeljem; Dispečer.IOoptimizirano za mrežne zahtjeve ili čitanje datoteka; i Dispečer.Zadanošto je prikladno za izračune koji intenzivno koriste CPU, kao što je obrada velike JSON datoteke. Za više informacija možete se obratiti ispravna upotreba dispečera Main, IO i Default.
S druge strane, Scopes (Područja) su ono što kontrolira životni ciklus. Koristite prikazModelOpseg o životni ciklusOpseg Ovo je bitno kako bi se spriječilo curenje memorije, jer ako korisnik zatvori zaslon, sve korutine povezane s tim područjem automatski se otkazuju, što sprječava aplikaciju da pokuša ažurirati prikaz koji više ne postoji.
Korutinski graditelji: Od lansiranja do asinkronosti
Za postavljanje korutine imamo na raspolaganju nekoliko alata za izradu. Najčešći je meluncurkanšto se koristi za zadatke koji ne vraćaju nikakvu vrijednost (pokreni i zaboravi). Obrnuto, ako nam je potreban rezultat, koristimo async, koji vraća objekt OdgođenaDa bismo dobili konačnu vrijednost potonjeg, koristimo funkciju čekati(), što obustavlja izvršavanje dok podaci ne budu dostupni.
Također postoji Blokiranje run-aAli imajte na umu, ovo potpuno blokira trenutnu nit. Ne biste to trebali vidjeti u produkcijskom kodu, jer krši filozofiju korutina; njegova prava korisnost leži u pisanje jediničnih testova ili u jednostavnim glavnim funkcijama konzole.
Sigurna komunikacija putem kanala
Kada su nam potrebne dvije korutine za međusobnu komunikaciju, dijeljenje globalnih varijabli je recept za katastrofu zbog kritičnih sekcija. Tu se Kanalikoje su strukture podataka siguran za konce dizajniran za slanje poruka kroz funkcije poslati y dobiti.
Kanal može funkcionirati kroz dinamiku sastanak (gdje se pošiljatelj i primatelj moraju vremenski podudarati) ili može biti BufferedChannelTo omogućuje pohranjivanje određenog broja poruka prije blokiranja pošiljatelja. Za dodatnu sigurnost možemo otkriti samo jednu Prijemni kanal ili PošaljiKanalčime se ograničava što vanjska strana može učiniti s kanalom i štiti integritet podataka.
Napredni obrasci i tokovi podataka
U svijetu kanala postoje obrasci poput Fan-outgdje nekoliko korumpiranih rutina troši isti kanal, dijeleći posao i Ventilatorgdje više odašiljača šalje podatke na jedan kanal. Ako tražimo nešto slično uzorku Observer, možemo koristiti BroadcastChannelgdje svaka poruka podjednako stiže do svih pretplatnika.
Za razliku od kanala, koji su "vrući" tokovi (emitiraju podatke čak i kada nitko ne sluša), tokovi To su "hladni" tokovi. To znači da se podaci proizvode samo kada postoji aktivni potrošač. Tok se sastoji od stvaranje toka, posredničke operatore za filtriranje ili transformaciju podataka i, konačno, terminalni operator koji aktivira prikupljanje informacija.
Sinkronizacija i upravljanje atomičnosti
Kako bismo spriječili preklapanje više niti s istom varijablom, postoji nekoliko strategija. Možemo koristiti muteksi sa svojom funkcijom s Lockom kako bi se lako zajamčilo međusobno isključivanje. Postoje i semafori koji kontroliraju pristup putem dozvola ili korištenjem atomskih tipova kao što su Atomski cijeli broj za jednostavne operacije koje ne zahtijevaju složene brave.
Još jedna zanimljiva tehnika je ograničenje nitišto se sastoji od dodjeljivanja jedne namjenske niti (kreirane s noviSingleThreadContext) za izmjenu određenog stanja. To osigurava da nema sukoba konkurentnosti jer samo jedna nit ima kontrolu nad tim podacima. Podijelite ove informacije kako bi više ljudi moglo saznati o ovoj temi.