Sigurna komunikacija između korutina korištenjem kanala i upravljanja konkurentnošću u Kotlinu

  • Korištenje kanala za sigurnu razmjenu podataka između korutina izbjegavajući dijeljena promjenjiva stanja.
  • Implementacija Dispečera i Opsega za optimizaciju izvršavanja zadataka na temelju potrošnje resursa.
  • Razlikovanje konkurentnosti i pravog paralelizma korištenjem async i await.
  • Asinkrono upravljanje tokom korištenjem obrasca funkcije obustave i upravljanja poslovima.

Korutine kanala

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.

Aplikacija za današnji TV program za Android
Povezani članak:
Kotlin: Osnovni jezik za razvoj Android i višeplatformskih aplikacija

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.

Kotlin vs. Java za programiranje Android aplikacija
Povezani članak:
Kotlin vs Java: Definitivna usporedba za programiranje Android aplikacija

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.


Dodaj kao preferirani izvor