Питхон асинц / аваит Објашњено: Водич за 2026
Асинц у Питхон-у има репутацију збуњујућег. Не мора да буде. Једном када интернализујете једну реченицу — асинц омогућава ЈЕДНОЈ нит да покрене више И/О-везаних задатака испреплетених — све остало следи.
Овај водич покрива: шта заправо раде асинц деф и аваит, када асинц побеђује у односу на погрешну алатку, четири обрасца које свака асинхронизована кодна база користи (секвенцијално, прикупљање, семафор, временско ограничење) и три начина на која почетници тихо гутају грешке.
Ментални модел од једне реченице
Асинхронизација у Питхон-у је кооперативна конкурентност у једној нити. Када ваш код притисне аваит, контрола се враћа у петљу догађаја, која може покренути други задатак док први чека на И/О. Када се И/О заврши, петља наставља са првим задатком од места где је паузирана.
То је то. Нема нити, нема процеса, нема паралелизма (у смислу ЦПитхон-витх-ГИЛ). Само једна нит жонглира са многим задацима који већину свог времена проводе чекајући на мрежи / диску / бази података.
Асинхронизација је бржа када ваше уско грло чека, а не рачунар.
Минимално одржив асинхронизовани програм од три реда
асинц деф хелло()— декларише корутину. Позивањехелло()не покреће код; креира објекат корутине.аваит асинцио.слееп(1)— враћа контролу у петљу догађаја на 1 секунду.асинцио.рун(хелло())— креира петљу догађаја и покреће корутину до завршетка.
Правило: `чекати` само унутар `асинц деф`. Позивање аваит у редовној функцији је СинтакЕррор.
Када асинц победи (а када не)
Асинц побеђује: И/О-везан рад
Сваки задатак који већину свог времена на зидном сату проведе ЧЕКАЈУЋИ је кандидат за асинхронизацију:
– ХТТП захтеви (спољни АПИ-ји, сцрапинг, веб-хукови)
- Упити у бази података
- Датотека чита / пише
- ВебСоцкет / гРПЦ токови
– Потрошачи у реду чекања (Редис, РаббитМК, Кафка)
Пример: преузимање 100 УРЛ адреса.
Убрзавање зидног сата од 50-100к за тежак И/О рад. Овде асинц зарађује свој буџет за сложеност.
Асинц ГУБИ: рад везан за ЦПУ
Асинц вам не даје паралелизам за рачунање. Пошто је кооперативна једнонитна, ЦПУ-хот петља блокира целу петљу догађаја.
Сви остали задаци нестају док пбкдф2 ради. За рад везан за ЦПУ, посегните за „мултипроцессинг“ или „цонцуррент.футурес.ПроцессПоолЕкецутор“, а не за асинц.
Мешовито радно оптерећење: рун_ин_екецутор
Ако је ЈЕДАН корак тежак ЦПУ, а остатак је И/О, умотајте ЦПУ корак тако да ради у групи нити без блокирања петље:
Ништа = подразумевани скуп нити. Одлично за позивање библиотека за синхронизацију трећих страна које су споре, али не можете да препишете.
Четири узорка
1. Секвенцијално — један по један задатак
Користите када сваки захтев зависи од резултата претходног.
2. асинцио.гатхер — пали све одједном
Подразумевани избор за независне И/О задатке. Али: ако прикупите 10.000 задатака на једном АПИ-ју, добићете дескрипторе датотека са ограниченом брзином или исцрпљивањем. Ту долази до семафора.
3. Семафор — ограничење конкурентности
асинцио.Семапхоре(Н) дозвољава највише Н задатака мимо асинц витх сем: у сваком тренутку. Остали задаци су у реду. Користите за било који спољни АПИ са ограничењем брзине или базу података са скупом веза.
4. Тимеоут — напустите спор рад
асинцио.ваит_фор отказује основни задатак након Н секунди. Неопходан за било који асинхронизовани код који разговара са мрежом — никада немојте чекати без ограничења.
Три замке за гутање грешака
Замка 1: асинцио.гатхер са ретурн_екцептионс=Труе
Корисно када желите да задржите делимичне резултате, али СМРТНО ако не проверите сваки резултат:
Без провере, грешке тихо нестају.
Замка 2: Испали и заборави задатке
Ако се бацкгроунд_ворк() подигне, Питхон емитује упозорење при гашењу и наставља даље. За све до чега вам је стало, сачувајте задатак и сачекајте га или користите асинцио.ТаскГроуп (3.11+) који преноси све грешке.
Замка 3: Синхронизујте код унутар асинхронизације
захтеви су синхрони. Чак и унутар асинц деф, рекуестс.гет блокира целу петљу док одговор не стигне. Користите хттпк (или аиохттп) за асинхронизовани ХТТП.
Правило: никада не користите синхрони И/О библиотеку унутар асинхронизованог кода. Ако библиотека нема асинхронизовану варијанту, умотајте је у рун_ин_екецутор.
асинцио.ТаскГроуп — начин за 2026
Питхон 3.11 је додао ТаскГроуп, који јасно решава проблем "попали и заборави":
Структурисана конкурентност — без изгубљених грешака, без изгубљених задатака. Преферирајте ово над голим цреате_таск у модерном коду.
Пример из стварног света: стругач са ограниченом брзином
Сва четири обрасца у 15 редова: ограничена конкурентност (семафор), временска ограничења (ваит_фор), експлицитне гране грешке (без гутања) и окупљање за одвајање. Копирајте и налепите овај облик у било који асинхронизовани И/О задатак.
Асинц у Питхон-у има стварну криву учења, али ментални модел је једноставан: једна нит, кооперативан паузира на чекање, И/О се преклапа. Мастер гатхер + Семапхоре + ваит_фор + ТаскГроуп и покрићете 95% асинхронизованог посла који ћете икада написати.
Следећи корак: сениор Питхон трацк има 20 практичних лекција о асинцио-у, ТаскГроуп-у, аиохттп/хттпк-у и горе наведеним обрасцима конкурентности — са правим Питхон-ом који ради у вашем претраживачу.