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 APIasinsija
un 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 asinhionuasync 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:
- Rindas:
asinsija
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 irnē 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ītaasinsija
un 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 asinsija
Zemā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.