Tavsiya qilamiz: Introduction to Django infrastructure
Deylik, dasturimiz qisqa vaqt ichida ko’p ishni bajarishi kerak. Mexanikada bir qoida bor: quvvat(ya’ni ishchi kuchi) qancha oshsa, ishni bajarishga ketadigan vaqt shuncha kamayadi. Masalan, ishni 1 ta ishchi 10 kunda tugatsa, 5 ta ishchi ikki kunda tugatadi.
Biz ham dasturimiz tezroq tugashi uchun ko’proq ishchi yollaymiz. Butun ishni bitta threadga yuklab qo’yish o’rniga bir nechta thread ochib, umumiy ishni ularga taqsimlab beramiz. Aynan mana shu narsa multithreading deyiladi. Oddiy matematika…
Bugungi mavzumiz multithreading bo’lmagani uchun bu haqida batafsil to’xtalmaymiz.
Dasturlash, umuman engineering sohasida biror usul yoki texnologiya ishlab chiqilsa, buning uchun albatta qandaydir sabab bo’ladi. O’sha yangi narsa qaysidir muammo(lar)ni hal qilishi kerak. Va yomon tarafi, o’sha yangi usulning o’zi ham boshqa, yangi muammolarni keltirib chiqaradi… Engineer sifatida vazifamiz ham muammolarga yechim topish. Multithreading orqali dastur bajarilishiga ko’p vaqt sarflash muammosiga qaysidir darajada yechim topdik. Xo’sh, bu yechim optimalmi? Asinxron bizga nega kerak?
Bu mavzuni tushuntirayotganimda ko’pincha bir xil misol keltiraman. Sababi, shu exampleda sabablar aniq ko’rinadi.
Tasavvur qiling, biz 100 ta URLga murojaat qilib ulardan ma’lumot olishimiz kerak. Deylik, har bitta URLdan ma’lumot olishga 1 soniya vaqt ketadi. Biz so’rov yuboramiz va 1 soniyadan keyin bizga javob keladi. Agar bitta thread ishlatsak, jarayon taxminan pastdagidek bo’ladi. javob kelishiga ketgan vaqtni o’xshatish uchun sleepdan foydalanamiz. Natijani to’liq ko’rish uchun taskni 100 marta emas, 5 marta bajaramiz:
5 ta taskni sinxron tarzda bajarish
Ko’rganingizdek, har safar faqat bitta kutish tugagandan keyingina keyingi qismga o’tayapmiz. Demak, blocking call bo’layapti. Umumiy natija esa 5 soniyadan ko’proq vaqt oldi. Tabiiyki 100 ta url uchun 100 soniyadan ko’proq vaqt ketadi(yana matematika).
Multithreading orqali bu vaqtni ancha kamaytirishimiz mumkin. Agar 10 ta threaddan foydalansak ular bir vaqtda 10 ta URL bilan ishlay oladi. Umumiy vaqt ham deyarli 10 marta kamaydi(matematika…). Umuman olganda, yaxshi natija.
Shu joyida Caleb Hattingh asynchronous executionni tushuntirgan misolni keltiraman:
Deylik, sizda kattagina restoran bor va shunga yarasha ish ham ko’p. Albatta, hamma ishga bir kishi ulgurolmaydi va shuning uchun siz o’nlab xizmatchilar oldingiz. Ixtiyoriy vaqt restoraniningizga kirganingizda shunga o’xshash vaziyatga duch kelasiz:
Bir ishchi ovqat uchun ko’kat to’g’rayapti, biri qozondagi ovqat pishishini kutib turibdi, yana biri barmen ichimlik berishini kutib turibdi, boshqasi mijozga menuni berib, buyurtma olishni kutib turibdi va h.k. Bir necha haftalik kuzatishdan so’ng shuni aniqladingizki, ishchilarning 90% dan ko’p vaqti kutish bilan o’tib ketayapti. Vaholanki, siz ularga bu vaqt uchun ham maosh to’laysiz. Bundan tashqari, xizmatchilar ko’pligidan ba’zida bir-biriga xalaqit berib qolishadi. Shunda ajoyib bir fikr kelib qoldi:
Modomiki, ular vaqtining katta qismini kutish bilan o’tkazayotgan ekan, butun restorandagi ishni kam sonli xizmatchilar bilan ham eplasa bo’lmasmikan?
Tavakkal qilib hamma xizmatchilarni ishdan bo’shatib, faqat 1 kishini qoldirdingiz.
U endi hamma ishni qiladi:
Ovqatni qozonga soladi va mijozga menuni beradi. Buyurtmani kutmasdan barmendan ichimliklarni oladi va egalariga yetkazadi. Keyin kelib boya menu bergan xo’randalardan buyurtmani oladi(agar tayyor bo’lsa) va shu orada ovqatdan ham xabar oladi. Qarabsizki, butun restoran ishlariga bir kishi ulgurayapti.
Asinxron dasturlash asosida ham xuddi shu g’oya yotadi — threadlar sonini oshirish o’rniga bitta threaddan effektivroq foydalanish. Thread bo’shmi? boshqa vazifa berish kerak.
Asinxron dasturlashda biz asosan ikki narsa — coroutine va event loopdan foydalanamiz. Coroutine bu bajarilishi kerak bo’lgan vazifa. Task deyishimiz ham mumkin. Event loop esa o’sha coroutinelarni aylanib chiqib, qaysi biri tayyor bo’lsa shunisini bajarib ketaveradigan thread.
Pythonda asinxron ishlash
Do'stlaringiz bilan baham: |