Programmēšana

Kā lietot asyncio Python

Python asinhronās programmēšanas funkcionalitāte jeb īsāk sakot, asinhronizēšana ļauj rakstīt programmas, kas vairāk strādā, negaidot neatkarīgu uzdevumu pabeigšanu. The asinsija bibliotēka, kas iekļauta Python, sniedz rīkus, lai izmantotu async diska vai tīkla I / O apstrādei, neliekot gaidīt visu pārējo.

asinsija nodrošina divu veidu API, lai risinātu asinhronas darbības:augsts līmenis unzems līmenis. Augsta līmeņa API ir visnoderīgākās, un tās ir piemērojamas visdažādākajām lietojumprogrammām. Zema līmeņa API ir spēcīgi, bet arī sarežģīti un tiek izmantoti retāk.

Šajā rakstā mēs koncentrēsimies uz augsta līmeņa API. Tālāk esošajās sadaļās mēs iepazīsimies ar visbiežāk izmantotajām augsta līmeņa APIasinsijaun parādiet, kā tos var izmantot kopīgām darbībām, kas saistītas ar asinhroniem uzdevumiem.

Ja esat pilnīgi jauns asinhronizācijā Python vai arī varat izmantot atsvaidzinošu informāciju par tā darbību, pirms ienirstat šeit, izlasiet manu ievadu par Python async.

Palaidiet korutīnas un uzdevumus Python

Protams, visbiežāk to lieto asinsija ir palaist jūsu Python skripta asinhronās daļas. Tas nozīmē iemācīties strādāt ar korutīnām un uzdevumiem.

Python asinhronos komponentus, ieskaitot korutīnas un uzdevumus, var izmantot tikai kopā ar citiem asinhronajiem komponentiem, nevis ar parasto sinhrono Python, tāpēc jums ir nepieciešamsasinsija lai mazinātu plaisu. Lai to izdarītu, jūs izmantojatasyncio.run funkcija:

importēt asinhionu

async def main ():

drukāt ("Gaida 5 sekundes.")

_ diapazonā (5):

gaidi asyncio.sleep (1)

drukāt (".")

drukāt ("Pabeigta gaidīšana.")

asyncio.run (main ())

Tas darbojasgalvenais (), kopā ar visām korutīnāmgalvenais () aizdegas un gaida rezultātu atgriešanos.

Parasti Python programmai jābūt tikai vienai.run () paziņojums, tāpat kā Python programmai vajadzētu būt tikai vienamgalvenais () funkciju. Async, ja to lieto neuzmanīgi, var padarīt programmas vadības plūsmu grūti lasāmu. Ja jums ir viens ieejas punkts programmas asinhronajā kodā, lietas netiek matainas.

Async funkcijas var ieplānot arī kāuzdevumivai objekti, kas aptin korutīnas un palīdz tās darbināt.

async def my_task ():

dari kaut ko()

task = asyncio.create_task (mans_uzdevums ())

mans_uzdevums () pēc tam tiek palaists notikumu lokā, un tā rezultāti tiek saglabātiuzdevums.

Ja jums ir tikai viens uzdevums, no kura vēlaties iegūt rezultātus, varat to izmantotasyncio.wait_for (uzdevums) gaidīt uzdevuma izpildi, pēc tam izmantojiettask.rezultāts () lai izgūtu tā rezultātu. Bet, ja esat ieplānojis veikt vairākus uzdevumus un vēlaties tos gaidītvisi no tiem pabeigt, izmantotasyncio.wait ([uzdevums1, uzdevums2]) lai apkopotu rezultātus. (Ņemiet vērā, ka operācijām varat iestatīt taimautu, ja nevēlaties, lai tās darbotos noteiktā laika posmā.)

Pārvaldiet asinhrono notikumu ciklu Python

Vēl viens izplatīts lietojumsasinsija ir pārvaldīt asinhronizācijunotikumu cilpa. Notikuma cilpa ir objekts, kas vada asinhronizācijas funkcijas un atzvanīšanu; tas tiek izveidots automātiski, kad izmantojatasyncio.run (). Vienā programmā parasti vēlaties izmantot tikai vienu asinhrono notikumu ciklu, lai lietas būtu pārvaldāmas.

Ja rakstāt modernāku programmatūru, piemēram, serveri, jums būs nepieciešama zemāka līmeņa piekļuve notikumu ciklam. Šajā nolūkā jūs varat "pacelt pārsegu" un strādāt tieši ar notikuma cilpas iekšpusi. Bet vienkāršiem darbiem tas nebūs vajadzīgs.

Lasiet un rakstiet datus ar straumēm Python

Labākie asinhronizācijas scenāriji ir ilgstošas ​​tīkla darbības, kurās lietojumprogramma var bloķēt gaidīšanu, kamēr kāds cits resurss atgūs rezultātu. Šajā nolūkāasinsija piedāvā straumes, kas ir augsta līmeņa mehānismi tīkla I / O veikšanai. Tas ietver darbību kā serveri tīkla pieprasījumiem.

asinsija izmanto divas klases,StreamReader unStreamWriter, lai lasītu un rakstītu no tīkla augstā līmenī. Ja vēlaties lasīt no tīkla, jūs to izmantojatasyncio.open_connection () lai atvērtu savienojumu. Šī funkcija atgriež kopuStreamReader unStreamWriter objektus, un jūs to izmantotu.lasīt () un.write () metodes katram sazināties.

Lai saņemtu savienojumus no attālajiem resursdatoriem, izmantojietasyncio.start_server (). The asyncio.start_server () funkcija kā argumentu uzskata atzvanīšanas funkciju,klienta_savienots_cb, kuru izsauc ikreiz, kad saņem pieprasījumu. Šī atzvanīšanas funkcija aizņemStreamReader un StreamWriter kā argumentus, lai jūs varētu apstrādāt servera lasīšanas / rakstīšanas loģiku. (Skatiet šeit vienkārša HTTP servera piemēru, kas izmantoasinsija-vadītsaiohttp bibliotēka.)

Sinhronizēt uzdevumus Python

Asinhronie uzdevumi mēdz darboties atsevišķi, taču dažreiz jūs vēlaties, lai viņi savstarpēji sazinātos.asinsija nodrošina rindas un vairākus citus mehānismus sinhronizēšanai starp uzdevumiem:

  • Rindasasinsija rindas ļauj asinhronām funkcijām rindot Python objektus, kurus patērē citas asinhronās funkcijas, piemēram, lai sadalītu darba slodzes starp dažāda veida funkcijām, pamatojoties uz to uzvedību.
  • Sinhronizācijas primitīvi: Slēdzenes, notikumi, apstākļi un semafori asinsija darbojas tāpat kā viņu parastie Python kolēģi.

Viena lieta, kas jāpatur prātā par visām šīm metodēm, ir tā, ka tās ir drošs ar diegu. Tas nav jautājums par asinhroniem uzdevumiem, kas darbojas tajā pašā notikumu ciklā. Bet, ja jūs mēģināt kopīgot informāciju ar uzdevumiem citā notikumu lokā, OS pavedienā vai procesā, jums būs jāizmantovītņošana moduli un tā objektus, lai to izdarītu.

Tālāk, ja vēlatiespalaišana korutīnas pāri pavedienu robežām, izmantojietasyncio.run_coroutine_threadsafe () funkciju un nododiet notikuma cilpu, lai to izmantotu kā parametru.

Apturiet korutīnu Python

Vēl viena izplatītaasinsijaun nepietiekami apspriestais gaida kādu patvaļīgu laiku korutīnā. Jūs nevarat izmantotlaiks. gulēt () vai bloķēsiet visu programmu. Tā vietā izmantojietasyncio.sleep (), kas ļauj citām korutīnām turpināt darboties.

Python izmantojiet zemāka līmeņa asinhronizāciju

Visbeidzot, ja domājat, ka jūsu veidotajai lietotnei var būt nepieciešama asinsijaZemāka līmeņa komponentiem, pirms sākat kodēt, apskatiet apkārtni: ir liela iespēja, ka kāds jau ir uzbūvējis ar asinhronizētu Python bibliotēku, kas dara visu, kas jums nepieciešams.

Piemēram, ja jums nepieciešama asinhrona DNS vaicāšana, pārbaudietaiodns bibliotēkā un asinhronām SSH sesijām irasyncSSH. Meklējiet PyPI pēc atslēgvārda “async” (kā arī citus ar uzdevumu saistītus atslēgvārdus) vai meklējiet ideju sarakstu ar roku sastādīto Awesome Asyncio sarakstu.

$config[zx-auto] not found$config[zx-overlay] not found