Жыйынтык долбоор: асинхрондуу API-кызмат
Көп булактан параллелдүү маалымат алабыз, аны иштетебиз жана тартуулайбыз - asyncio негизиндеги бирдиктүү кызмат.
Негизги идея: чыныгы кызмат убактысынын көбүн күтүү менен өткөрөт - тармактык жооптор, диск, башка кызматтар.
asyncio бир агымга миңдеген ушундай күтүүлөрдү бир убакта кармап, даяр болгонуна которулууга мүмкүндүк берет. Бул жыйынтык долбоордо биз кичине, бирок продакшенге жакын баа агрегаторун курабыз: ал бир нече тышкы API'ден бааларды параллелдүү алат, аларды типтештирилген жазууларга келтирет, натыйжаларды жашоо убактысы (TTL) менен кэштейт жана HTTP суроо-талаптарга жооп берет - 1-15 темалардан типтештирүү, dataclasses, контекст менеджерлери, asyncio жана профилдөөнү кайра колдонуп.
Теманын аягында сиз төмөнкүлөрдү жасай аласыз:
- кызматты бир окуя циклинин айланасында алуу -> иштетүү -> тартуулоо катмарларына бөлүү,
- киргизүү-чыгарууну
asyncio.gatherжанаasyncio.TaskGroupаркылуу параллелдүү аткаруу, - параллелдикти
Semaphoreменен чектөө жана ар бир чакырыкка таймаут кошуу, - тармактык ресурстарды асинхрондуу контекст менеджери аркылуу ээлөө,
- CPU жүгүн
run_in_executor'га чыгарып, циклди жооп берүүчү кармоо, - убакыт кайда кетээрин далилдеш үчүн кызматты профилдөө.
1. Кызматтын формасы
Код жазуудан мурун чек араларды аныктаңыз. Биздин кызматта үч милдет бар, ар бири так келишими бар жука катмар:
- Алуу - N тышкы API'ге HTTP аркылуу кайрылып, чийки JSON кайтарабыз. Бул таза киргизүү-чыгаруу жана async колдонуунун себеби.
- Иштетүү - ар түрдүү чийки маалыматты бирдиктүү типтештирилген формага (
Quote) айландырабыз. Негизинен CPU боюнча жеңил, кээде андай эмес. - Тартуулоо - кардардын суроолорун кабыл алабыз, алуу + иштетүүнү уюштурабыз, жоопту кэштейбиз жана жооп беребиз.
Бөлүү ар бир катмарды өзүнчө тестирлеп жана профилдөөгө мүмкүндүк берет, ал эми HTTP-клиентти алмаштыруу тартуулоо логикасына тийбейт. Төмөнкү диаграмма циклден өтүп жаткан бир суроону көрсөтөт, ал эми үч булакка чакырык бир убакта аткарылып жатат.