"Enter"a basıp içeriğe geçin

Python Threading Modülü (MultiThread)

Merhaba Arkadaşlar

Python ile yazdığımız program fonksiyonlarının çoğu kez paralel olarak çalışması gerekebilir. Yani iki fonksiyon aynı anda yada bir fonksiyonun farklı değerler ile aynı anda çalışması gerekebilir. Bu durumda fonksiyonu yada fonksiyonları sırasıyla çalıştırmak işimizi görmeyecektir. Örneğin belirttiğimiz değeri, belirttiğimiz aralıklar ile belirttiğimiz kadar ekrana basan (çok belirtili bir cümle oldu, farkındayım) bir program yazalım.

#-*-coding:utf-8-*-
from time import sleep, strftime

def bastir(deger, sure, adet):
    print "Başlayan Değer: "+deger
    while adet > 0:
        sleep(sure)
        print deger+" | "+strftime("%H:%M:%S")
        adet -= 1

bastir("Emre Geldegul Blog", 2, 3)

Yukarıda yazdığımız kodu açıklayalım;

Öncelikle bastir diye bir fonksiyon tanımladım ve argüman olarak degersure ve adet argümanlarını aldım. Ardından hangi değerin başladığını belirtip bir döngü oluşturdum. Döngü adet değişkeni 0 dan büyük olduğu sürece devam edecek. Daha sonra belirtilen saniye kadar bekleyip ekrana değer ile zamanı yazıyor, ardından adetten 1 eksiltip tekrar başa dönüyor. Son satır ise gönderilen argümanlar.

Buna göre “Emre Geldegul Blog” değerini 2 saniye arayla 3 kez ekrana bastır dedik. Program sorunsuz bir biçimde çalıştı, isteğimizi yerine getirdi. Ancak dediğimiz gibi aynı anda “CODERLAB Bilişim” değerini 3 saniye arayla 2 kez ekrana bastırmak istesek bunu fonksiyonları sırası ile çalıştırarak yapamayız.

bastir("Emre Geldegul Blog", 2,3)
bastir("CODERLAB Bilişim", 3,2)

Bu kod önce ekrana 2 saniye arayla 3 kere “Emre Geldegul Blog” yazısını bastırır daha sonra 3 saniye arayla 2 kez “CODERLAB Bilişim” yazısını bastırır. Şimdi Threading modülünü kullanarak paralel olarak çalışacağız.

MultiThreading

Diğer modüllerde olduğu gibi threading modülünü içeriye aktarıyoruz. Bu modülün “thread” sınıfını kullanacağız.

t1 = Thread(target=bastir, args=("Emre Geldegul Blog", 2,3))
t2 = Thread(target=bastir, args=("CODERLAB Bilişim", 3,2))

Burada Thread fonksiyonunu t1 ve t2 değişkenlerine atadık, target ile hedef fonksiyonumuzu belirttik ve bu fonksiyona girilecek argümanları args diyerek belirttik. Şimdi bunlara start verme vakti.

t1.start()
t2.start()

Kısacası kodun son hali aşağıda ki şekilde oldu.

#-*-coding:utf-8-*-
from time import sleep, strftime
from threading import Thread

def bastir(deger, sure, adet):
    print "Başlayan Değer: "+deger
    while adet > 0:
        sleep(sure)
        print deger+" | "+strftime("%H:%M:%S")
        adet -= 1

t1 = Thread(target=bastir, args=("Emre Geldegul Blog", 2,3))
t2 = Thread(target=bastir, args=("CODERLAB Bilişim", 3,2))

t1.start()
t2.start()

Threadlarımızı oluşturduk ve start verdik. Şimdi bir kontrol edelim.

Evet, çalıştı! fonksiyonu aynı anda farklı değerler ile kullandı. Threadı durdurmak için ise _stop() fonksiyonunu kullanabilirsiniz.

t1._stop()
t2._stop()

Bir döngü ile aynı threadı defalarca çağırabilirsiniz. Problemsiz bir şekilde çalışacaktır (!). Ancak bu durumda threadlar başı boş gezecektir, ne gözleyeni ne kollayanı… kafasına göre takılacaktır.

Açık konuşmak gerekirse threading konusu başlı başına bir derya ve ben bu konuda ciddi bir bilgi birikimine sahip değilim. Yinede bildiğim kadarını paylaşmak istedim. Yinede siz takıldığınız kısımları yorum olarak sormayın yoksa çakılıp kalabilirim 🙂

Ayrıca Python, multi threading konusunda maalesef iyi bir dil değil. Hassas hesaplamalarda kullanımını kesinlikle önermiyoruz.

Yardımcı olabilmek dileklerim ile kolay gelsin.

2 Yorum

  1. Anonymous
    Anonymous 9 Mayıs 2019

    Merhaba oncelikle paylasiminiz icin tesekkurler.
    Size bir sorum olacak. Multi threading alanında ciddi bir bilginizin olmamasına ragmen (sizin yazinizdan yola çıkarak söylüyorum ) Python in bu konuda iyi bir dil olmadigina nasıl kanaat getirebiliyorsunuz ?

    • Yunus Emre Geldegül
      Yunus Emre Geldegül 10 Mayıs 2019

      Dediğim gibi çok bilgim yok, ne teknik kısmında nede modül kısmında. Ama Python ve Ruby gibi dillerin önünde bir engeli var: GIL.

      A global interpreter lock (GIL) is a mechanism used in computer-language interpreters to synchronize the execution of threads so that only one native thread can execute at a time. An interpreter that uses GIL always allows exactly one thread to execute at a time, even if run on a multi-core processor.

      Yani kabaca meali 1 kerede 1 thread çalıştırır demek bu. O zaman bu program bu işi nasıl yapıyor? Evet, işlemleri bölerek 🙂

      Python doesn’t allow multi-threading in the truest sense of the word. It has a multi-threading package but if you want to multi-thread to speed your code up, then it’s usually not a good idea to use it. Python has a construct called the Global Interpreter Lock (GIL). The GIL makes sure that only one of your ‘threads’ can execute at any one time. A thread acquires the GIL, does a little work, then passes the GIL onto the next thread. This happens very quickly so to the human eye it may seem like your threads are executing in parallel, but they are really just taking turns using the same CPU core. All this GIL passing adds overhead to execution. This means that if you want to make your code run faster then using the threading package often isn’t a good idea.

      Okuduklarım ve gördüğüm kadarı ile yorum yapabiliyorum, yanlışımın olduğunu düşünüyorsan yorum olarak yazarsan sevinirim.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.