Асинхрондук Python: asyncio
Бир агым, миңдеген үстү-үстүнө коюлган киргизүү-чыгаруу операциялары, колбэксиз
asyncio көптөгөн киргизүү-чыгаруу менен чектелген операцияларды бир агымда конкуренттүү аткарат. Корутина али даяр эмес нерсеге (сокет, таймер, жооп) await кездешкенге чейин иштейт; ошол учурда ал токтотулуп, башкарууну окуялар циклине кайтарат, ал болсо башка даяр корутинаны иштетет. Процессордо эч нерсе параллелдүү аткарылбайт — анын ордуна күтүү убактысы үстү-үстүнө коюлат. Бул кооперативдик конкуренттүүлүк: тапшырмалар ар бир await учурунда өз ыктыяры менен башкарууну беришет.
- конкуренттүүлүк менен параллелизмдин айырмасын жана asyncio эмне үчүн киргизүү-чыгаруу тапшырмаларына багытталганын түшүндүрүү;
async defкорутиналарын жазуу жана алардыasyncio.runаркылуу иштетүү;asyncio.create_taskжанаasyncio.gatherаркылуу чыныгы конкуренттүүлүктү уюштуруу;asyncio.timeoutаркылуу ишти убакыт менен чектөө жанаCancelledErrorтуура иштетүү;async forаркылуу маалымат агымдарын керектөө жанаasync-генераторлорду жазуу;- тузактарды таануу: унутулган
await, циклди тоңдуруучу блоктоочу чакырыктар жана CPU-тапшырмаларда туура эмес колдонуу.
1. Конкуренттүүлүк — бул параллелизм эмес
Параллелизм бир нече нерсенин бир эле учурда ар кайсы процессор өзөктөрүндө аткарылышын билдирет (multiprocessing берген нерсе). Конкуренттүүлүк бир нече тапшырманын аткарылуу процессинде болуп, кезектешип турганын билдирет, бирок каалаган өзүнчө учурда чындыгында бирөө гана иштейт. asyncio конкуренттүүлүктү берет, параллелизмди эмес: ал бир агымды колдонуп, күтүүнү үстү-үстүнө коёт.
Бул киргизүү-чыгаруу менен чектелген тапшырмалар үчүн эң туура келет — HTTP-суроолор, маалымат базасына суроолор, файлдарды окуу, сокеттер менен иштөө — программа убактысынын көбүн сырткы бир нерсени күтүп өткөргөндө. Бир суроо байттардын келишин күтүп жатканда, цикл экинчисин иштетет. Процессор менен чектелген тапшырмалар үчүн (сандарды эсептөө, чоң маалыматтарды талдоо) asyncio эч кандай ылдамдатуу бербейт, себеби үстү-үстүнө коюла турган бош убакыт жок; ал жерде процесстерди же агымдарды колдонуңуз.
await — "бул убакыт талап кылат, ошол убакта башка нерсе кылайын" деген учур.