Мазмунга өтүү

Сабактын башталышы

Асинхрондук 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 эч кандай ылдамдатуу бербейт, себеби үстү-үстүнө коюла турган бош убакыт жок; ал жерде процесстерди же агымдарды колдонуңуз.

Салыштыруу: көп казаны бар бир ашпозчу. Жакшы ашпозчу бир казандын кайнаганын карап турбайт. Ал пастаны коюп, ал кайнап жатканда жашылчаларды туурайт; мешин таймери шыңгыраганда ага кайрылат. Бир ашпозчу (бир агым), бир нече тамак иште (көп корутина). Ашпозчу эч качан эки тамакты бир учурда бышырбайт, бирок кечки тамактын жалпы убактысы кыскарат, себеби күтүү үстү-үстүнө коюлат. asyncio — ошол ашпозчу; ар бир await — "бул убакыт талап кылат, ошол убакта башка нерсе кылайын" деген учур.

Бул сабакты YourAIZone платформасында улантыңыз

Толук сабакта — толук түшүндүрмө, чыгарылган мисалдар, көп кездешкен каталар, заматта текшерилүүчү тесттер жана ЖИ-репетитор. Конок катары дароо баштаңыз же прогрессти сактоо үчүн аккаунт түзүңүз.

Толук сабакта

  • Толук түшүндүрмө
  • Чыгарылган мисалдар
  • Көп кездешкен каталар жана алардан кантип качуу керек
  • Тест суроолору: 15
  • Тема боюнча суроолорго жооп берген ЖИ-репетитор
  • Окуучу, ата-эне жана мугалим үчүн прогрессти көзөмөлдөө