DEV Community

Turdıbek Jumabaev
Turdıbek Jumabaev

Posted on

Pythonda asinxron

Asinxron haqqında aytıwdan aldın thread, yaģıniy aģım haqqında bilip alayıq. Ádette biz jazģan kodlar joqardan tómenge qarap izbe-iz oqıladı hám orınlanadı. Usı izbe-iz orınlanatuģın operaciyalar izbe-izligi thread delinedi. Basqasha qılıp aytqanda thread bul bizdiń kodımızdı orınlaw ushın kompyuter tárepinen jallanģan “jumısshı”. Onıń waziypası kodtı oqıp, kerekli operaciyalardı orınlaw.

Thread kodlardı joqardan tómenge qarap orınlaydı hám qaysıdur bólegine kelgende kútiw jaģdayına túsiwi múmkin. Máselen, programma bizden input mánis kirgiziwdi soraģan waqtında islewden toqtap turadı hám mánis kirgizgenimizde jáne islewdi dawam etedi. Bul jaģdayda thread “blocked”, yaģınıy bloklanģan delinedi. Bunday jaģdaydı keltirip shıģarģan operaciyalar bolsa ulıwmalastırıp “blocking call” delinedi. Programmanıń sırttan maģlıwmat alatuģın yamasa maģlıwmat uzatatuģın bólegi IO-bound workload delinedi. Ulıwma alģanda, hár qanday túrdegi “IO-bound workload” blocking callģa mısal bola aladı.

Aytayıq, programma qısqa waqıt ishinde kóp ámellerdi orınlawı kerek. Mexanikada bir qaģıyda bar: quwat qansha kóbeyse, isti orınlawģa ketken waqıt sonsha azayadı. Máselen, belgili bir jumıstı 1 jumısshı 10 kúnde orınlasa, 5 jumısshı eki kúnde juwmaqlaydı. Biz programmamız tezrek juwmaqlanıwı ushın kóbrek jumısshı jallaymız. Pútkil jumıstı bir threadke júklep qoyıw ornına bir neshe thread ashıp, ulıwmalıq jumıstı olarģa bólistirip beremiz. Áyne usı nárse multitreading delinedi.

Keliń bir mısal kóremiz. Kóz aldıńızģa keltiriń, biz 100 URLge soraw jiberip olardan maģlıwmat alıwımız kerek. Deylik, hár bir URLden maģlıwmat alıwģa 1 sekund waqıt ketedi. Biz soraw jiberemiz hám 1 sekundtan keyin juwap keledi. Eger bir dana thread isletsek, proces shama menen tómendegishe boladı. Juwap keliwine ketken waqıttı uqsatıw ushın sleepten paydalanamız. Nátijeni kóriw ushın cikldi 100 márte emes, 5 márte tákirarlayıq:

Image description

Kórgenimizdey, hár sapar tek ģana bir sekund kútip keyingi sorawģa óttik. Demek, blocking call bolıp atır. Ulıwmalıq nátije 5 sekundtan kóbirek waqıt aldı. 100 URL ushın 100 sekundtan kóbirek waqıt ketedi.

Multitheading arqalı bul waqıttı ádewir kemeytiriwimiz múmkin. Eger 10 threadten paydalansaq olar bir waqıtta 10 URL menen isley aladı. Ulıwmalıq waqıt da derlik 10 márte azayadı. Bıraq multitreading menen asinxron bir nárse emes.

Usı jerde asinxronnıń islewin túsindiriw ushın mısal keltiremen:
Kóz aldıńızģa keltiriń, sizde úlken restoran bar hám soģan jarasa jumıslar da kóp. Álbette hámme iske bir adam úlgermeydi, sonıń ushın siz onlaģan xizmetkerler jumsaysız. Qálegen waqıtta restoranģa kirgenińizde tómendegishe jaģdayģa dus kelesiz: Bir jumısshı awqat ushın kartoshka tuwrap atır, birewi qazandaģı awqat pisiwin kútip turıptı, barmen ishimlik beriwdi kútip turıptı, basqası klientke menyudi berip, buyırtpa alıwdı kútip turıptı hám t.b. Jumıs procesin bıraz kúzetip qarasańız, jumısshılardıń 90%ten kóp waqıtı kútiw menen ótip atır. Bıraq siz olarģa bul waqıtlar ushında pul tóleysiz. Bunnan tısqarı jumısshılar kóp bolģanlıģınan bazı waqıtları bir-birine kesent etip qaladı. Usı jerde bir pikir keldi: Jumısshılardıń kóp waqıtları kútiw menen ótip atırģan eken, pútkil restorandaģı jumıstı az jumısshılar menen de eplewge bolmayma?
Táwekel etip hámme xizmetkerlerdi jumıstan bosatıp, tek ģana 1 adamdı qaldırdıńız. Ol endi hámme jumıstı qılıwı kerek. Awqattı qazanģa saladı hám klientke menyudi beredi. Buyırtpanı kútip otırmay barmennen ishimlikti aladı hám iyelerine jetkeredi. Keyin kelip baģanaģı menyu bergen klientten buyırtpanı qabıllaydı (eger tayyar bolsa) hám usı arada awqattan da xabar aladı. Qarsańız, pútkil restoran jumızlarına bir adam úlgerip atır.

Asinxron programmalastırıw tiykarında da usı princip jatadı. Threadler sanın asırıw ornına bir theadten effektivlew paydalanıw. Thread bospa, basqa waziypa beriw kerek.

Asinxron programmalastırıwda tiykarınan eki nárse, coroutine hám event looptan paydalanamız. Coroutine bul orınlanıwı kerek bolģan waziypa, task depte atawımız múmkin. Event loop bolsa sol tasklardı aylanıp shıģıp, qaysısı tayyar bolsa, sonı orınlap keteberetuģın thread.

Event loop — restorandaģı xizmetshi, coroutine bolsa bir waqıtta orınlanıwı kerek bolģan waziypalar (buyırtpa alıw, awqat pisiriw, …).

Usı xizmetshi bir neshe waziypalardı orınlaģanı siyaqlı, event loop da bir waqıtta bir neshe corountinelerdi júrgizedi. Waqıttan únemli paydalanıw ushın, waziypanıń áyne qaysı bólegin kútiw kerek ekenligin biliwimiz kerek. Sonda, sol jerge kelgende kútip turıwımız kerek ekenligin bilip, keyingi waziypaģa ótip ketemiz. Máselen, xizmetshi menyudi klientke bergennen keyin buyırtpa alaman degenshe kútip turıwı kerek ekenligin biledi hám kútiw ushın waqıt sarıplamastan keyingi waziypaģa ótip keteberedi hám keyinrek jáne aylanıp keledi.

Eger asinxron programmalastırıw ne ekenligi túsinikli bolsa, keliń endi onıń qolınan ne keletuģının kóremiz:

Image description

5 taskti 1 sekundta orınladı. Bul jaqsı nátiyje, solay emespe?
Itibar bergen bolsańız, birinshi URLge request jiberilgen waqıtta event loop, coroutinedi kútip otırmay keyingisine ótip ketti. Qızıq, coroutine qayjerde keyingi taskke ótiw kerek ekenligin qalay bilip atır? Juwap — await járdeminde.

Demek, async asinxron funkciyanı, await bolsa sol tasktiń qay jerinde basqa teskke ótiw múmkin ekenligin bildiredi.

main funkciyası arqalı biz orınlawımız kerek bolģan tasklerdi jiynap aldıq. asyncio.gather() funkciyası coroutinelerdi jiynap alıp, bir event loopde júrgizdi hám nátijelerdi aldı.

Asyncio bul Python tárepinen jaratılģan, asinxron programmalardı isletiw ushın standart kitapxana. Bıraq bul asinxron kodtı iske túsiriwdiń jalģız usılı emes. Qáleseńiz basqa kitapxanalardan paydalanıwıńız yamasa ózińiz tazasın jazıp alıwıńız múmkin.

Hár dayım yadıńızda saqlań, hesh bir usıl yamasa texnologiya jetik emes. Hámmesiniń ózine tán jaqsı hám jaman tárepleride bar. Hámmesin óz ornında paydalanıw kerek. Asinxron sizdiń programmańızdı tezlestirip bermeydi, tek ģana kútiwlerdiń aldın aladı.

Asinxron programmalastırıw “IO-bound workload”da járdem beriwi múmkin. Bıraq “CPU-bound workload”ta emes.

IO-bound workload — programmaģa sırttan maģlıwmat kirgiziliw waqtında threadti kútiwge májbúrleytuģın bólegi. Sırttan kirip keliwshi maģlıwmat degende internet, hard disk yamasa paydalanıwshı tárepinen kiritiletuģın maģlıwmatlar názerde tutıldı!
CPU-bound workload — programmanıń quramalı esap-kitaplar yamasa kóp maģlıwmat menen islegende, CPU hám RAMģa úlken basım beretuģın bólegi.

Tómende “CPU-boud workload” jaģayına dus kelingen. Kórip turģanıńızday sinxron hám asinxron derlik birdey waqıt sarıplaģan:

Image description

Joqarda aytılģanlar menen, asinxron juwmaqlanıp qalmaydı. Asinxron júdá úlken hám quramalı tema. Bul maģlıwmatlar arqalı tek asinxronnıń ne ekenligin bilip alıwıńız múmkin bolģanı. Elede kóbirek maģlıwmatlar kerek bolsa, internetten izlep kóriń.

Úyreniwden hám taza nárselerdi sınap kóriwden hesh qashan sharamań, ele hámmesi aldında…

Top comments (0)