Šis ir raksts no Python pasaules, bet tas joprojām ir piemērojams visai programmēšanas jomai, lai gan multithreading ļauj mums ātrāk apstrādāt pieprasījumus, bet ir arī griesti, zaļie (mikro pavedieni) pavedieni ir risinājums.
Daudzpavedienu programmatūras izstrāde atrisina lielu skaitu problēmu, īpaši uz tīklu orientētām lietojumprogrammām, kurām nepieciešama prasīga veiktspēja, lai ātri reaģētu uz lietotājiem. Diemžēl ar daudzpavedienu nepietiek, lai atrisinātu liela mērogaVienlaicīgumsseksuālās problēmas.
Šo problēmu risināšanai ir jāmaina programmēšanas modeļi, izmantojot asinhronus notikumus un uz atzvanīšanu balstītus mehānismus. Druva mēs izveidojām python bibliotēku ar nosaukumu Dhaga, lai atrisinātu liela mērogaVienlaicīgums, savukārt plānošanas modelim nav nepieciešamas būtiskas izmaiņas.
Programmatūras izstrādātāji dzīvo vienāVienlaicīgumspasaule. Mūsdienās pavedieni ir pirmās klases pilsoņi, it īpaši izstrādes laikā, it īpaši, ja jūsu lietojumprogramma veic intensīvas tīkla darbības, piemēram, inSync sistēma (tīkla drošības sinhronizācijas produkts), piemēram, Druva. Multithreading palīdz programmēšanas koda plūsmai tīkla operācijām vienkārši un sakārtoti. Ja mūsu lietojumprogrammai ir nepieciešami veiktspējas uzlabojumi vai uzlabojumi, to var uzlabotElastība, mēs varam palielināt pavedienu skaitu.
Bet, ja runa ir par tūkstošiem svaruVienlaicīgumsPieprasījumi, pavedieni nav pietiekami.
Mēs konstatējām, ka daudzpavedienam ir šādi trūkumi: 1. inSync sistēmas klientam ir jādublē liels skaits failu serverī, izmantojot tīkla RPC zvanus. Tipisks veids, kā izstrādātāji var paātrināt lietas, ir izmantot pavedienus. Tomēr vairāku pavedienu radītā veiktspēja palielina atmiņas un CPU izmaksas; Izstrādātājiem ir jāsaglabā līdzsvars starp ātrumu un pavedienu skaitu.
2. Mūsu serveriem ir jārīkojas starp inSync sistēmu un tūkstošiem klientuVienlaicīgumsSavienojumi un paziņojumi. Lai efektīvi apstrādātu savienojumus, pieprasījumu apstrādei mēs izmantojam pavedienus. Taču pieaugošais inSync sistēmas klientu skaits nozīmē arī to, ka mums ir jāturpina palielināt pavedienu skaitu, kas patērē daudz servera atmiņas un CPU.
3. Mūsu tīmekļa serverim ir jāapstrādā tūkstošiem paralēlu HTTP pieprasījumu. Lielākā daļa darba tiek veikta tīkla ligzdās, kas saņem un nosūta datus un nodod tos inSync sistēmas aizmugures sistēmai. Liek lielākajai daļai pavedienu gaidīt tīkla operācijas. Izraisot C10K problēmu, kad tīmekļa serverim ir tūkstošiem sinhronu pieprasījumu, pavediena ģenerēšana katram pieprasījumam ir diezgan nemērogojama (mērogs).
Asinhrono sistēmu ierobežojumi Daudzi asinhroni ietvari, tostarp Twisted, Tornado Tornado un asyncore, var palīdzēt izstrādātājiem attālināties no populārajiem pavedienu izmantošanas veidiem. Šīs sistēmas balstās uz nebloķējošām ligzdām un atzvanīšanas mehānismiem (līdzīgi kā Node.js). Ja mēs izmantojam šos ietvarus tādus, kādi tie ir, mūsu Druva koda galvenās daļas būs jāpārveido. Tas nav tas, ko mēs vēlamies darīt. Koda pārveidošana palielina izstrādes un testēšanas ciklus, neļaujot mums izpildīt mūsu mēroga prasības. Ņemot vērā, ka vairākām produkta daļām ir jābūt masīvām, katram no mums tās būs jāpārveido – līdz ar to jāpieliek pūles dubultot vai trīskāršot.
Lai izvairītos no tik daudz koda maiņas, mums bija jāatsakās no esošās sistēmas tiešas izmantošanas. Par laimi, mēs atradām dažus noderīgus rīkus.
Tā kā mēs vēlamies kontrolēt koda izpildi tīkla I/O, mums ir nepieciešams veids, kā sadalīt pavedienu mikro pavedienos. Mēs atrodamzaļumi。 Tas nodrošina netiešu mikropavedienu plānošanu, ko sauc par koprutīnas korutīnu. Citiem vārdiem sakot. Tas ir noderīgi, ja vēlaties kontrolēt koda darbību. Jūs varat izveidot mikropavedienus pielāgotiem grafikiem, jo jūs varat kontrolēt, kad zaļumi dod pauzes. Tas ir ideāli piemērots mums, jo tas dod mums pilnīgu kontroli pār mūsu koda plānošanu.
Tornado ir vienkārša, nebloķējoša tīmekļa servera sistēma, kas rakstīta Python valodā, kas paredzēta, lai apstrādātu tūkstošiem asinhronu pieprasījumu. Mēs izmantojam tā galveno komponentu IOLoop IOStream. IOLoop ir nebloķējoša ligzdas I/O notikumu cilpa; Tas izmanto epoll (operētājsistēmā Linux) vai rindas (BSD un Mac OS X), pretējā gadījumā izvēlieties (operētājsistēmā Windows), ja tās ir pieejamas. IOStream nodrošina nebloķējošas ligzdas, piemēram, ērtu iepakojumu lasīšanai un rakstīšanai. Mēs deleģējam visas ligzdu operācijas Tornado un pēc tam izmantojam atzvanīšanu, lai aktivizētu koda operācijas, lai pabeigtu (banq piezīme: ļoti līdzīgs Node.js mehānismam).
Tas ir labs sākums, bet mums vajag vairāk. Ja mēs izmantojam iepriekš minēto moduli tieši savā kodā, liela daļa mūsu RPC koda būs jāmaina, plānojot RPC caur zaļumiem, pārliecinoties, ka zaļumi nebloķējas (ja zaļumi aizsērē, tas aizsērēs visu pavedienu un visus pārējos), rīkojieties ar atzvanīšanas funkcijām no tornado.
Mums ir nepieciešama abstrakcija, lai pārvaldītu un sakārtotu zaļumus, lai izvairītos no to aizsērēšanas ar ārējiem zvaniem, un šī abstrakcija var būt masveidā mērogojama ārpus pavedieniem. Šī abstrakcija ir Dhaga, kas ļauj ieprogrammēt lietojumprogrammas koda plūsmu kā tradicionālo sinhrono secību, bet izpilde ir asinhrona.
Dhaga (no hindi, kas nozīmē pavediens) ir izpildes ietvars vieglam pavedienam, kuru mēs abstrahējam. Dhaga klase ir atvasināta no zaļumiem un izmanto steka pārslēgšanu, lai izpildītu vairākas koda plūsmas vienā operētājsistēmas pavedienā. Vienas operētājsistēmas pavedieni izpilda vairākas dhagas, izmantojot sadarbības plānošanu. Ikreiz, kad dhaga gaida (galvenokārt gaida RPC izsaukuma atgriešanos), tā dod kontroli vecāku līmenim (t.i., OS līmeņa pavediena izpildes kontekstam, kas to izveidoja). Pēc tam vecāku līmenis ieplāno vēl vienu dhaga, lai būtu gatavs skriešanai. RPC izsaukums tiks nodots tornado tīmekļa serverim, lai rakstītu ligzdu asinhroni, un pēc tam reģistrēs atzvanīšanu, kad tas atgriezīsies, un, kad šis RPC atgriezīsies, gaidošais dhaga tiks pievienots izpildāmajai rindai un pēc tam to paņems vecākpavediens. (Banq piezīme: līdzīgs node.js principam)
Mēs varam izmantot Dhaga pavedienu vietā augsta latentuma operācijām, un mēs izmantojam 512 dhagas vienā pavedienā, kad pavedienu skaits palielinās virs saprātīgas caurlaidspējas robežas.
|