Intervyudagi savollar: Threading vs Process
Future DreamsMaqola intervyuda o'zimga berilgan savollar asosida yozildi.
Xo'sh, shaxsan o'zim ish bo'yicha ancha intervyularda bo'lganman. Shularda ko'p uchraydigan savollardan biri haqida yozmoqchiman. Threading va multiprocessing aslida nima, ularning farqlari va ishlatiladigan holatlari bilan tanishishga urinib ko'ramiz.
Hardware thread hamda software threadlar mavjud. Hardware thread bu CPU ning fizik imkoniyatidan kelib chiqadi, software thread esa dastur orqali "yasaladigan" obyekt, deb tushunsak bo'ladi. Biz bu maqolada software thread haqida gapiramiz.
8 yadroli, core i7, 11-avlod...
Biz hammamiz kompyuter tanlaganda shunaqa jumlalarga duch kelamiz: protsessori kuchli, core i3, i5, i7, 4-8 yadroli... lekin bu narsalar nimani anglatishi haqida bosh qotirib ko'rganmizmi? Keling, hozir shunga qiziqib ko'ramiz.
CPU (protsessor) yadrolarga bo'linadi, CPU ning turiga qarab yadrolar soni har xil bo'lishi mumkin: 1, 2, 4, 8 ... Mana shu yadrolar odatda bizga shu kompyuterda bir vaqtda nechta process ishlata olishimizni bildiradi. Bu degani, 1 yadroli CPU da faqat 1 dona process ishlaydi, boshqa hech nima ishlay olmaydi, degani emas, bu tomoni sal murakkabroq. Lekin, bu mavuzga juda chuqur kirmaymizda, barchaga ma'lum bo'lgan fakt bilan xulosa qilamiz: 1 dona yadro (core) bir vaqtda 1 dona process ishlata oladi.
Demak, process bu ancha yirik tushuncha, har holda u butun boshli yadro (core) ni band qilyapti. Thread esa sal kichikroq: 1 dona process bir qancha threadni ishlata oladi.
Keling tepadagi o'rganganlarimizni umumiylashtirib "rasm chizamiz". 1 ta yadroda 1 ta process ishlaganini hisobga olib, quyidagi rasmda process va yadro atamalarini xuddi sinonimdek ishlatib ketamiz, demak, aynan hozirgi vaiyatimizda yadroni processdek qabul qilishingiz mumkin (aslida unday bo'lmasa ham):

Asosiysi: CPU ichida yadro (core), yadroda process, process ichida thread (oqim). Rasmda 3 ta yadro tasvirlangan, bu shunchaki rasm, aslida yadrolar soni ko'proq yoki kamroq bo'ladi, xuddi shu kabi threadlar soni ham ko'proq yoki kamroq bo'lishi mumkin.
Bular bizga nega kerak?
Dastur bir ishni juda ko'p marta takrorlashi yoki o'xshash ishlarni ko'p marotaba bajarishi, og'ir hisob kitoblarni qilishiga to'g'ri kelishi mumkin. Biz odatda dastur yozganimizda, u 1 dona processning ichidagi 1 dona threadda ishlaydi (rasmdagi 1 dona sariq maydonga qarang). Biz CPU ning kuchidan to'liqroq foydalanish uchun boshqa threadlar, yoki kerak bo'lsa, processlardan foydalanishimiz mumkin. Shu bilan dasturni tezroq ishlata olamiz.
Qachon Thread, qachon Process ishlatamiz?
Bunga javob berishdan oldin bir narsani aniqlavolamiz. Dasturimiz IO-bound yoki CPU-bound bo'lishi mumkin.
IO-bound - Input/Outputga bog'liq bo'lgan jarayonlar. Internetdan fayllar yuklab olish, foydalanuvchidan biror ma'lumot kiritishini so'rash, xotiraga ma'lumot yozish va hokazolar. Asosiysi, biz ma'lumotlarni kirityapmiz, chiqaryapmiz, yuklab olyapmiz, yuklayapmiz...
CPU-bound - og'ir hisob-kitoblarni talab qiluvchi jarayonlar. Masalan, 3D sahnani render qilish, rasmni tahrirlash, videomontaj va boshqalar... bular ko'plab hisoblashlarni talab qiladi, CPU ga ko'p buyruqlar "bajartiradi".
Threadni IO-bound vazifalar uchun ishlatish ko'proq tavsiya etiladi.
Processni esa CPU-bound vazifalar uchun ishlatish afzal.
Thread vs Process
Processlarning har biri alohida fizik qismda - yadroda ishlagani uchun, 2 ta process parallel ishlaydi, ya'ni, bir vaqtda, birdaniga, bir-biriga xalal bermagan holda. Bu CPU dan ko'proq energiya talab qiladi.
Thread esa 1 dona yadroda ishlab turgan processning ichida ish boshlaydi. 1 ta processdagi 2 ta thread aslida parallel ishlamayadi, ya'ni, rostmana 1 vatqda emas. Unda qanday qilib bir qancha threadlarni bir vaqtda ishlatamiz?
Gap shundaki, bizga barcha threadlar parallel ishlayotgandek tuyuladi, aslida esa ular mana bu tartibda ishlaydi: 1 thread ishlab boshlaydi, qachon o'sha thread bironnimani (masalan, fayl yuklab olishni, shunchaki foydalanuvchidan ma'lumot kiritishini, va h.k.) kutib qolsa, shu ondayoq boshqa bir thread kelgan joyidan davom etib ketadi. Mana shu sodda tartib bilan threadlar navbat almashib o'z ishini qilaveradi, bu jarayon, ya'ni threadlarni almashtirib ishlatib turish o'ta tez amalga oshadi, shu tarafdan ham bu bizda ular bir vaqtda ishlayotgandek taassurot uyg'otishi mumkin.
Threadlar o'rtasida ma'lumot almashinish, processlar orasida ma'lumot almashinishdan ko'ra osonroq.
Pythonda multiprocessing, threading kabi modullar bor. Bugungi maqolada ularni ishlatib kod yozib ko'rsatmoqchi emasman. Bugun siz bilan asosiy tushunchalarni ko'rib o'tdik, nasib qilsa kodlarni boshqa biror payt ko'rarmiz.
Maqola intervyulardagi savollar haqida edi. Keling sizga o'sha savollardan ba'zilarini beraman, siz javob berishga urining. Agar bugungi maqoladan yetarlicha ma'lumot topolmasangiz (topolmasligingiz aniq), o'tirib, ko'k choy damlavolib bir izlanish qilasiz. Demak, savollar:
Process va thread nima?
Qay biri ishga tushishda ko'proq vaqt oladi: process yoki thread?
Threadlar bilan ishlaganda qanday muammolarga duch keamiz?
GIL ning threadlarga ta'siri qanday? GIL ni o'chirib qo'yish nimalarga olib keladi?
Bizda 4 yadroli CPU bor, agar yozgan kodimizda 6 ta processni bir vaqtda run qilsak, nima bo'ladi?
Mana sizga savollar, maqolani shu joyida tugatib, sizni savollar bilan yolg'iz qoldiramiz.
Xohlovchilar bu savollarni @python_uz guruhida muhokama qilishi mumkin.
Tavsiya: muhokama qilishdan oldin internetdan ma'lumot qidirib ko'rish - bu eng yaxshi usul.