• Rezultati Niso Bili Najdeni

Asinhrono programiranje

2.2 Spletna aplikacija

2.2.3 Asinhrono programiranje

V naˇsem primeru se ukvarjamo s pretakanjem velike koliˇcine podatkov, saj ˇzelimo podatke zajemati s frekvenco vzorˇcenja do 192kHz in razmeroma visoko dinamiˇcno globino AD pretvorbe (16-bitno ali 24-bitno). Da lahko to doseˇzemo z uporabo pro-gramskega jezika Python, ki sam po sebi ni najhitrejˇsi, je potrebno uporabiti primerna orodja, ustrezne knjiˇzice in naˇcin programiranja. Poleg tega naˇsa aplikacija zahteva ˇse druge funkcionalnosti, kot so istoˇcasno izvajanje procesiranje signalov, prikazovanje podatkov veˇcim uporabnikom hkrati in upravljanje z enoto za zajemanje med tem, ko se meritve izvajajo. Na podlagi teh zahtev in omejitev smo se odloˇcili, da bomo precejˇsen del programa za zajemanje napisali na asinhron naˇcin.

V nadaljevanju bo v grobem predstavljeno asinhrono programiranje in kako se to razlikuje od bolj pogosto uporabljenega sinhronega programiranja. Velik del kode je napisane v programskem jeziku Python, za asinhrone operacije pa njegov vgrajeni modul Asyncio [29]. pri razumevanju tega ter njegove uporabe, smo si pomagali s knjigo avtorja C. Hattingh [30].

2.2.3.1 Primerjava sinhronega in asinhronega programiranja

Pri klasiˇcnemu programiranju se operacijska opravila izvajajo sinhrono oziroma eno za drugim. Z drugimi besedami, vedno moramo ˇcakati, da se trenutno opravilo zakljuˇci, da lahko zaˇcnemo z izvajanjem naslednjega. Za razliko od tega, se lahko pri asinhronemu programiranju premikamo na druga opravila ˇse preden se trenutno konˇca. Na ta naˇcin lahko operiramo z veˇc zahtevki hkrati in poslediˇcno opravimo veˇc opravil v precej krajˇsem ˇcasu. Za primerjavo izvajanja sinhronega in asinhronega programa ter laˇzjo predstavo si lahko ogledamo shemo 2.11. Ta shema sicer prikazuje idealen primer, ko so si vsa opravila neodvisna med seboj in se lahko izvajajo istoˇcasno. Vˇcasih je eno izmed opravil odvisno od drugega. V tem primeru se kombinira sinhroni in asinhroni naˇcin, kjer pa ˇse vedno v skupnem pridobimo na ˇcasu.

Glavni fokus asinhronega naˇcina programiranja je, kako ˇcimbolj uˇcinkovito istoˇcasno izvesti ˇcim veˇcje ˇstevilo opravil na eni niti. Tu moramo poudariti, da gre predvsem za vrsto opravil, pri katerih se med njihovo izvedbo pojavijo obdobja ˇcakanja in ki so med sebojneodvisna. Glavna logika je torej, da med tem ko ˇcakamo, da se doloˇceno opravilo izvrˇsi do konca (npr. ˇcakamo na odgovor), lahko nit izvaja drugo opravilo.

To pride ˇse posebno do izraza pri omreˇznem programiranju, saj so CPU-ji raˇcunalnika precej hitrejˇsi od hitrosti omreˇzja. CPU raˇcunalnika tako opravilo izvrˇsi hitro, vendar nato ˇcaka na I/O omreˇzja. Asinhroni naˇcin programiranja nam torej ponuja sledeˇca:

– Varno alternativo za programiranje prekinjevalne veˇcopravilnost (nitenje oz. ang.

threading) in s tem izognitvi hroˇsˇcem, tekmovalnim razmeram in drugim nepredvi-dljivim sluˇcajem, ki se pojavijo pri tovrstnem programiranju.

– Razmeroma enostaven naˇcin podpore veˇc tisoˇc istoˇcasnih povezav vtiˇcnic (ang. soc-ket connections). Z drugimi besedami, upravljanje z dlje ˇziveˇcimi povezavami za novejˇse tehnologije na podroˇcju IoT kot so WebSockets ali MQTT.

Vredno je ˇse omeniti, da en naˇcin programiranja sam po sebi ni nujno boljˇsi od dru-gega. Sta le drugaˇcna in vsak ima svoje prednosti in slabosti, ter jih uporabimo v

Teoretiˇcne osnove in pregled literature

Opravilo 1

Opravilo 1

Opravilo 2

Opravilo 2

Opravilo 3

Opravilo 3

Čas

Pridobljeni čas Sinhrono

Asinhrono

Slika 2.11: Primerjava poteka opravil pri sinhroni in asinhroni izvedbi.

razliˇcnih scenarijih, odvisno od zahtev naˇse aplikacije. Velikokrat se uporabljata tudi v kombinaciji, saj so doloˇcena opravila med seboj odvisna in jih ni mogoˇce vedno izvajati asinhrono.

Sočasnost

Paralelizem (Nitenje, Async IO)

(Multiprocesiranje)

Slika 2.12: Pozicioniranje asinhronega programiranja glede na druge podobne metode (nitenje in multiprocesiranje).

2.2.3.2 Osnovni gradniki Asyncio

Tu bomo po knjigi avtorja C. Hatting [30] opisali osnovne gradnike, ki so kljuˇcni pri asinhronem naˇcinu programiranja. Uradna Python dokumentacija za Asyncio [13] je v osnovi precej obseˇzna, vendar se moramo zavedati, da je veliko ˇstevilo API-jev v 18

Teoretiˇcne osnove in pregled literature modulu namenjenih razvijalcem spletnih ogrodji in knjiˇzic (kot je npr. Django, Flask itd.) torej jih povpreˇcen razvijalec za razvoj neke enostavne aplikacije ne potrebuje.

V nadaljevanju se bomo dotaknili glavnih podroˇcij, ki jih mora razvijalec poznati pri asinhronem programiranju v okviru programskega jezika Python.

Korutine (ang. corutines)

Korutina (ang. corutine) je objekt, ki je zmoˇzen nadaljevati izvedbo znotraj leˇzeˇce funkcije, ˇcetudi je bila ta zaustavljena pred dokonˇcanjem. Python je torej zmoˇzen

”preklapljati”med korutinami, medtem ko to med klasiˇcnimi funkcijami ni mogoˇce.

Zanka dogodka (ang. Event loop)

Zanka dogodkov je odgovorna za vse preklapljanje med korutinami, lovljenje izjem in ˇse veliko veˇc. Sama interakcija z zanko dogodkov pri programiranju z Asyncio modulom v programu ni vedno potrebna, je pa v specifiˇcnih primerih, ko potrebujemo veˇcji nadzor nad dogajanjem, nujna.

Naloge in prihodnosti (ang. Tasks and Futures)

Veˇcino ˇcasa se pri asinhronem programiranju uporabljajo naloge (ang. Tasks). Naloga nam predstavlja korutino, ki je v izvajanju. Obstajajo ˇse prihodnosti (ang. Futures), ki pa predstavljajo prihodnja konˇcana stanja aktivnosti (instanca dobi ob zaˇcetku izvajanja status ”ni ˇse dokonˇcno izvedena”, ampak vemo, da bo do enkrat v prihodnje

”konˇcana”).

Teoretiˇcne osnove in pregled literature