Python Multithreading

Python’da multithreading konusuna başlamadan önce thread’in ne olduğuyla ilgili kısaca bilgi vermek istiyorum. Kısaca thread’ler bir programın aynı anda paralel işlemler yapabilmesini sağlar.

Programların yapısını düşündüğümüzde; her programın bir sayacı, önceliği, süreç grubu vs. var. İşletim sistemimiz bu süreç(execution) bilgilerini sıralı liste(linked list) ve ya dizi(array)’de tutuyor. Zamanlayıcı dediğimiz eleman çalışan süreçlerden hangisinin durdurulup hangisinin çalışacağına karar verir, burada farklı algoritmalar işin içine giriyor ancak konumuz bu değil. Bilmemiz gereken işlemcilerin aynı anda sadece bir işlem yapabildikleri.

Multithreading kullanarak bir işlem içerisinde işlemde olan programın farklı bölümleri paralel olarak çalıştırılabilir. Aslında tam paralel değil yine thread’ler bir sıraya göre çalışıyor. Ancak işleme alım algoritmalarından dolayı paralel çalıştıklarını görüyoruz.

Thread’ler de işlemcide sırayla işe giriyor, process(işlemler) de neden multithreading kullanmam gerekir ki diyebilirsiniz. Burada şöyle bir farklılık var, işlemci bir process’i aldığında ona bir alan ayırır, bu girdi/çıktı olayına context switch denilir ve işlemcide bir gecikmeye yol açar. Thread’ler zaten process’ler içinde bulunuyor. Zaten process’e ayrılmış alan içinden çalışıyorlar, yani bahsettiğim gecikme olmuyor.

Gelelim Python’da multithreading kullanmaya örnek bir program yazıp onun üzerinden anlatacağım.

import threading
import time
 
class ornekThread (threading.Thread):
    def __init__(self, threadID, sayac):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = "Thread-" + str(self.threadID)
        self.counter = sayac
    def run(self):
        print "Baslatiliyor " + self.name
        print_time(self.name, self.counter, 5)
        print "Cikiliyor " + self.name
 
def print_time(threadAdi, uyu, sayac):
    while sayac:
        time.sleep(uyu)
        # Saniye'nin yazilmasi
        print "%s: %s" % (threadAdi, time.strftime("%S"))
        sayac -= 1
 
# Yeni thread'ler olusturuyoruz
thread1 = ornekThread(1, 1)
thread2 = ornekThread(2, 2)
 
# Thread'ler baslatiliyor
thread1.start()
thread2.start()
 
print "Ana thread'den cikiliyor"

Çıktı

Baslatiliyor Thread-1
Baslatiliyor Thread-2
Ana thread'den cikiliyor
Thread-1: 11
Thread-2: 12
Thread-1: 12
Thread-1: 13
Thread-2: 14
Thread-1: 14
Thread-1: 15
Cikiliyor Thread-1
Thread-2: 16
Thread-2: 18
Thread-2: 20
Cikiliyor Thread-2

Başta threading’i import ederek python’ın multithreading kütüphanesine erişmiş olduk. Kendi thread’lerimizi oluştururken bunları ‘threading.Thread’ sınıfından türetmemiz gerekiyor biz de burada öyle yaptık. Thread’lerin ‘run’ fonksiyonunu burada override ettik.

thread1.start()

komutu aslında Thread’lerin run fonksiyonunu çalıştırıyor.

Şimdi kodun bu kısmını farklı thread’ler için inceleyelim.

def run(self):
    print "Baslatiliyor " + self.name
    print_time(self.name, self.counter, 5)
    print "Cikiliyor " + self.name
 
def print_time(threadAdi, uyu, sayac):
    while sayac:
        time.sleep(uyu)
        # Saniye'nin yazilmasi
        print "%s: %s" % (threadAdi, time.strftime("%S"))
        sayac -= 1

Thread 1
sayac = 5 değerine sahip
döngüye girdik
uyu = 1 değerinde yani 1 saniye bekleyip saniyeyi basacak
thread 1 -> her saniye, saniyeyi yazacak.
5 defa çalışacak.

Thread 2
sayac = 5 değerine sahip
döngüye girdik
uyu = 2 değerinde yani 2 saniye bekleyip saniyeyi basacak
thread 2 -> her 2 saniyede bir saniyeyi yazacak.
5 defa çalışacak.

Bir Cevap Yazın