Python'da Multithreading ve Multiprocessing

Bu multithreading isini cok karistirdilar. 

Thread ve Process

Thread ve Process, birbirinden bagimsiz olarak calisabilen (teorik olarak) kod parcaciklaridir. 

Aradaki fark, ayni program tarafindan olusturulan threadler ayni hafiza alanina erisebilir. Buna karsilik process kendi basina bagimsiz bir program olarak dusunulebilir, Kendine ait hafiza alani vardir. 

Bu da demek oluyor ki, thread'ler kendi aralarinda haberlesebilmek icin ekstra bir efora ihtiyac duymazken, process'leri birbiri ile konusturabilmek icin ekstra birseler (gRPC?) yapmak gerekir. Yukarida ayni program tarafindan olusturulan threadler derken bile, aslinda buradaki program, bir process'tir. Her process primary thread olarak adlandirilan en azindan 1 adet thread'e sahiptir. (Single threaded tabirini hatirlayalim). 




Peki neden birden fazla thread'e ihtiyac duyalim? 

Kullanici acisindan, birden fazla process'in ayni anda calistirilbilmesi demek, ayni anda birden fazla uygulamayi calistirabilmek anlamina geliyor. MSN'de takilirken bir taraftan da Winamp'ta muzik dinlemeyi buna borcluyuz. 

Burada bir parantez acmak gerekiyor. Birden fazla program, birden fazla process demek. Ancak bilgisayarda tek bir core var ise, bu durumda iki process ayni anda calistirilamaz. Burada isletim sistemi devreye girer. Egere multitasking yapabilen bir isletim sistemi ise (Widows, linux, macOS...), her process icin ornegin 20 milisaniye bir cpu suresi ayirir. Yani aslinda programlar paralel olarak degi de sira ile calistirilir. Ancak bu sure kullanicinin algilayabileceginden cok daha az oldugu icin bize sanki programlar paralelde claisiyor gibi gorunur.

Diger bir taraftan da, multi core olsun olmasin, ayni yaklasimla, bir processin threadleri de paralel calisiyormus gibi gozukebilir. Bu da programci olarak bizlere daha fazla kontrol saglar. Ornegin bir masaustu uygulamasinda bir thread kullanicidan gelen inputlara cevap verirken, bir baska thread de arka planda verileri isliyor olabilir. Bu sayede kullanici arka planda donen islerin bitmesini beklemeden programi kullanmaya devam edebilir. 


Hangisini Kullanalim?

Uygulamamiz tek process ve birden fazla thread ya da bir process ve de baska sub-process'ler yaratarak multitasking yapabilir. Genelde, (Python harici) multi-threading'in one ciktigini gorebiliyoruz.

Multithreading'in faydalari:
- Thread'ler tek cpu uzerinde calisacak ise, context gecisleri process'e gore daha az maliyetlidir. Cunku process'in contex'i daha buyuktur. 
- Thread'ler ayni memory space'e baktigi icin hafiza paylasimi sozkonusudur. 
- Thread'ler farkli core'lar uzerinde calisabilir ve gercek paralelizm sunabilir. 




Eger bu imkanlariniz var ise, (buna gelecegiz ama Python'da bir nokta eksik), multi threading gercekten de multi-processing'e gore avantajli. 

Pro Tip: Sistem kaynaklarini en iyi sekilde kullanabilmek adina, sistemde bulunan core basina bir thread yaratarak, gelen requestleri queue'layip bu threadler vasitasi ile islersek, en iyi verimi almis oluruz. 


Python?

Yukarida bahsettik ki thread'ler birden fazla CPU uzerinde gercekten de paralel olarak calisabilir. Ayni anda kod execute edebilir. Ancak bu durum Python'da tam da boyle degil. Global Interpreter Lock (GIL) olarak tabir edilen mekanizma yuzunden, ayni anda sadece tek bir Python kodu execute edilebilir. Yani biz 10 thread'i 10 core uzerinde de calistirsak, temelde bunlar sirayla calisacak. 

Ha, bu noktada hic avantaj saglamiyor mu? Mesela bir web crawler yaziyoruz diyelim. Program suresinin buyuk bir kismi, web serverlerinden response bekleyerek gecer. Iste bu bekleme asamasinda, thread bloke oldugu zaman, direk diger thread calistirilmaya gecilebilir. Bu durumda program bosuna beklememis olur. 

Bu acidan Python literaturunde su sekilde bir yaklasim vardir:
- Multi threading : I/O Bound uygulamalar icin kullanislidir.
- Ancak CPU bound tasklariniz varsa, multi-processing yapmak zorundasinizdir. Cunku CPU bound islemlerde (mesela 1milyona kadar olan asal sayilari hesapliyoruz), zaten tum threadler bloklanacagi icin, tek thread calistirmaktan bir farki olmayacaktir. Ancak ornegin JVM'de GIL olmadigi icin, threadler farkli core'lar uzerinde gercekten paralel olarak calismaya devam edebilirler. 

Multi-processing kullanmak da, yukarida bahsettigimiz gibi egere process'ler arasinda iletisim gerekli ise ekstra bir complexity getirebilir. 



Stay hungry, stay foolish, stay healthy :) 

Ciao!









  

Yorumlar

Bu blogdaki popüler yayınlar

Threat Modeling 1

Encoding / Decoding