Az aszinkron programozás Python

Az aszinkron programozás Python egyre népszerűbb. Ezekre a célokra, sok különböző könyvtárakban. A legnépszerűbb közülük - Asyncio. amely egy standard könyvtár Python 3.4. Ebben a cikkben megtudhatja, mi az aszinkron programozás és a különbségek a különböző könyvtárak végre aszinkron Python.

viszont

Minden sor kódot a program végre váltakozva. Például, ha van egy sor kódot kérő valamit a szerver, ez azt jelenti, hogy a program nem csinál semmit, amíg a válaszra várnak. Bizonyos esetekben ez megengedett, de sok - nem. Az egyik megoldás erre a problémára az áramok (szálak).

Streams teszi a programot, hogy végre több feladatot egyszerre. Természetesen, a menetek számos hátránya van. Többszálú programok bonyolultabb, és általában hajlamosabbak a hibákat. Ezek között olyan kérdések: az állam a verseny (race condition), a kölcsönös (holtpont) és az aktív (livelock) zár, kimerültség erőforrások (erőforrás éhezés).

összefüggésben kapcsolási

Bár az aszinkron programozás, és lehetővé teszi, hogy megkerülje baj foltok patakok, azt tervezték, egy teljesen más célja -, hogy kapcsoljuk ki a processzor összefüggésben. Ha több szálat, minden mag futhat csak egy szál egy időben. Ahhoz, hogy minden szál / folyamatok források megosztása, a processzor gyakran végez összefüggésben kapcsolót. Hogy könnyebb, a processzor egy tetszőleges frekvenciájú megtartja az összes kontextus információáramlás és átkapcsol egy másik szál.

Aszinkron programozás - a stream feldolgozó szoftver / felhasználói térben, ahol az alkalmazás nem a processzor, áramlását szabályozza és kontextus váltás. Az aszinkron programozás keretében csak akkor kapcsol, előre meghatározott kapcsolási pontok helyett az intervallumok leírt CPU.

hatékony titkár

Streams - öt titkárok, amelyek mindegyike egy feladatot, de csak az egyiket hagyjuk működni egy bizonyos ideig. Ahhoz, hogy a titkárok dolgozott streaming módban van olyan eszköz, amely figyeli a munkájukat, de nem érti a problémát maguk. Mivel a készülék nem érti a feladatok jellege lenne állandóan váltani öt titkárok, még ha hárman ülnek csinál semmit. Körülbelül 57% (valamivel kevesebb, mint 3/5) keretében kapcsolási lett volna, de hiába. Annak ellenére, hogy a processzor összefüggésben kapcsoló hihetetlenül gyors, mégis időt vesz igénybe, és a CPU erőforrásokat.

zöld szálak

Mint látható, az API interfész Gevent néz ki, mint áramlik. Azonban a színfalak mögött használ korutinokat (korutinokat), ahelyett, hogy folyik, és fut ezeket a ciklusban események (event loop) a sorban. Ez azt jelenti, hogy kap a haszon áramlik anélkül, hogy megértenék korutinokat, de nem megszabadulni a problémákat, amelyek a flow. Gevent - egy jó könyvtár, de csak azok számára, akik értik, hogyan szálak működik.

Nézzünk néhány szempontból aszinkron programozás. Az egyik ilyen szempont - ebben a ciklusban az eseményeket. ciklus események - minden esemény / feladat és egy hurok, amely kiterjeszti a sorból, és végrehajtja azokat. Ezek a feladatok az úgynevezett korutinokat. Ők egy kis sor parancsok, amelyek többek között, utasítások milyen eseményeket, ha szükséges, vissza kell küldeni a sorban.

A visszahívási funkció (visszahívás)

Python, egy csomó könyvtárak aszinkron programozás, a legnépszerűbb a Tornado, Asyncio és Gevent. Lássuk, hogy a Tornado. Ez használ egy visszahívási módra (callback) aszinkron hálózati IO. Visszahívás - jellemző, ami azt jelenti: „Amint ez megtörtént, kövesse ezt a funkciót.” Más szóval, akkor hívja a helpdesk, és hagyja a számot úgy, hogy mikor lesz elérhető, hívják vissza, ahelyett, hogy várni a választ.
Lássuk, hogyan kell csinálni ugyanaz, mint fent, a Tornado:

tornádó. ioloop. IOLoop. Például (). start ()

A példában látható, hogy az első sorban handle_response funkció ellenőrzi a hibákat. Erre azért van szükség, mert nem tudja kezelni a kivétel. Ha a kivételt jött létre, akkor nem kell gyakorolni a kódot az esemény hurok. Ha letölti lefut, akkor megkezdi a HTTP-kérést, majd feldolgozza a választ, hogy az esemény hurok. Mire, ha hiba történik, a hívás verem fogja tartalmazni a ciklus események és jelenlegi funkciója, míg máshol a kód nem működik kizárását. Így minden kizárások létre a visszahívási funkció megszakítja a ciklust az események, és megáll a program végrehajtását. Ezért minden hibát kell nevezik tárgyak, nem kezelik, mint kivétel. Ez azt jelenti, hogy ha még nem ellenőrizte a hibákat, akkor nem kerül feldolgozásra.
Egy másik probléma a visszahívások abban a tényben rejlik, hogy az aszinkron programozás, az egyetlen módja annak, hogy dugulások elkerülése - ez visszahívás. Ez oda vezethet, hogy nagyon hosszú láncú: visszahívás után a visszahívás után a visszahívás. Mivel az elveszett hozzáférést a verem, és a változók, akkor előbb-utóbb szállítására nagy tárgyakat minden callback, de ha használja az API, harmadik fél felületek, nem tudja megmondani semmit, hogy hívja vissza, ha nem tudja elfogadni. Ez is lesz a probléma, mert minden callback függvények mint a patak. Például azt akarod, hogy hívja a három API interfész és várja meg, amíg mind a három visszatér az eredmény általánosítható. A Gevent megteheti, de nem visszahívások. Lesz kis pokoldovat, tárolása az eredmény egy globális változót, és ellenőrzi a visszahívás, hogy a végeredményt.

Ha azt szeretnénk, hogy megakadályozzák blokkoló IO, akkor kell használni, vagy flow-k vagy aszinkron. A Pythonban választhat a zöld szálak és aszinkron visszahívások. Íme néhány azok jellemzői:

zöld szálak

  • áramlások kezelése az alkalmazás szintjén, hanem hardver;
  • Ez magában foglalja az összes problémát streaming programozás.

visszahívás

  • korutinokat láthatatlan a programozó;
  • Visszahívások használatának korlátozását kivételek;
  • visszahívások nehéz nyomon követni.

Hogyan lehet megoldani ezeket a problémákat?

Akár Python 3.3 zöld folyamok és visszahívási optimális megoldásokat. Felülmúlni ezeket a döntéseket igényelnek támogatást szinten nyelvet. Python kell valahogy részben hajtsa végre a módszert, hogy állítsa le a végrehajtás, miközben a tárgyak verem kivételek. Ha még nem ismeri, Python fogalmak, érted, mit kapok, hogy a generátor. A generátor lehetővé teszi a függvény visszatérési lista egy eleme egy időben, megállás a végrehajtás addig a pillanatig, amikor a következő elem kérik. A probléma a generátorok, hogy azok teljesen függ a funkció, hívja őt. Más szóval, a generátor nem okozhat a generátor. Legalább hosszú volt, mint a PEP 380 nem így a hozzá szintaxis. amely lehetővé teszi a generátor, hogy az eredmény egy másik generátort. Bár az aszinkron és nem ez a fő célja a generátor, akkor minden tulajdonságával, hogy nagyon hasznos. Generátor támogatja a köteget, és kivételeket. Ha írásos ciklus események, ami fut a generátor, akkor lett volna egy nagy aszinkron könyvtárban. Pontosan ez az, amit Asyncio könyvtár jött létre.

Kb. Trans. A példák a aiohttp 1.3.5. A legújabb verzió a könyvtár egy másik szintaxis.

Számos funkció, hogy figyelembe kell venni:

  • Hiba továbbított helyesen a verem;
  • Akkor vissza az objektum, ha szükséges;
  • Akkor futtatni korutinokat;
  • nincs visszahívások;
  • 10. sor nem kerül végrehajtásra, amíg a 9-es vonal teljes mértékben végrehajtják.

Az egyetlen probléma az, hogy a tárgy néz ki, mint egy generátor, és ez problémát okozhat, ha valóban ez volt a generátort.

Aszinkron és megvárja

Asyncio könyvtár elég erős, így Python döntöttünk, hogy a standard könyvtár. A szintaxis is hozzá kulcsszó aszinkron. Címkék célja, hogy növelje a láthatóságát az aszinkron kód. Tehát most a módszerek nem tévesztendő össze a generátorok. Aszinkron kulcsszó a def. azt mutatják, hogy a módszer aszinkron. Kulcsszó várják azt mutatja, hogy vársz, hogy teljes korutinokat. Itt ugyanaz a példa, de a kulcsszó aszinkron / várják:

A program tartalmaz egy eljárást aszinkron. A felfutási idő, visszatér a coroutine, amely aztán várakozik.

következtetés

Kiváló aszinkron könyvtár épült Python. Nézzük ismét felidézni a probléma áramlások és hátha most megoldódott:

  • CPU összefüggésben váltás. Asyncio aszinkron és használ egy esemény hurok. Ez lehetővé teszi, hogy kapcsolja a program keretében;
  • Versenyhelyzet: a Asyncio fut egyetlen coroutine és kapcsolt csak a pontokat, hogy meghatározzák, a kód nem tartozik a szóban forgó faj folyik;
  • Kölcsönös / aktív blokkolás: mivel most már nincs áramlás a verseny, akkor nem kell aggódnia, zárak. Bár holtpont is előfordulhat olyan helyzet, amikor két korutinokat hívják egymást, így nem valószínű, hogy meg kell próbálni, hogy ez megvalósuljon;
  • kimerültség források: mivel korutinokat futtatni egy szál, és nem igényel további memóriát, sokkal nehezebb lesz, hogy elfogyott a források. Azonban Asyncio van egy medence a „művészek» (végrehajtók), ami lényegében egy medence szálak. Ha fut túl sok folyamatot a medencében az előadóművészek, akkor is szembe kell néznie a források hiánya.

Annak ellenére, hogy Asyncio elég jó, ez is megvannak a saját problémái. Először, Asyncio adunk közelmúltban Pythonban. Vannak hiányosságok, amelyek még nem korrigált. Másodszor, ha éppen aszinkron, ami azt jelenti, hogy az összes kódot kell aszinkron. Ez annak a ténynek köszönhető, hogy a végrehajtás aszinkron funkciók túl sok időt, és ezáltal gátolják az esemény hurok.

Számos módja van aszinkron programozás Python. Használhatja zöld szálak, visszahívások vagy korutinokat. Bár egy csomó lehetőség, a legjobb közülük - Asyncio. Ha ön használ Python 3.5, jobb lenne, ha használja ezt a könyvtárat, mert be van építve python mag.

Kapcsolódó cikkek