Başlangıç > Dökümanlar > Python ile Multi-Threading

Python ile Multi-Threading

Python makalelerimde henüz bu aşamaya gelmedik ama bir arkadaşın isteği üzerine yazıyorum. Python dizisini baştan takip eden arkadaşlar bunu yoksaysınlar. :D Yeri geldiğinde ben size anlatıcam daha ayrıntılı şekilde.

Öncelikle Thread nedir? bunu açıklayayım. Threadler iş parçacıklarıdır. Bazen ana program için bazı işlemlerin 1 kez veya sonsuza kadar yapılması gerekmektedir. (Sonsuz=Program çalıştığı sürece.) Böyle bir ihtiyacımızda yeni bir program yazıp iki programı haberleştirmektense yeni bir iş parçacığı(Thread) oluşturarak programımız için ilgili işlemi sürekli yapmasını sağlayabiliriz. Threadler geniş bir konudur. Lock,Join,RLock v.s bir sürü kullanabileceğimiz özelliği vardır. Bu istek üzerine bir makale olduğundan hepsine girmeyeceğim. Sırası geldiğinde ayrıntılı açıklayacağım.

Mesela örnek olarak ana programımız çalışırken, arka planda kullanıcının yüklemiş olduğu dosya ZIP formatında sıkıştırılsın ve aynı path’e konulsun ve bunları yaparkende UI’i kitlemeden yapalım. Thread kullanmadan yapsaydık siz upload veya button’a bastığınızda uploading işlemini beklemeniz gerekecekti. Oysaki biz Thread ile arkaplanda işlemlerimizi gerçekleştirdiğimizden kullanıcı UI’de istediği gibi işlerine devam edebilir. Dediğim gibi çok girmeden hemen kodlara geçiyorum.

  1. #!D:Python30pythonw.exe -o
  2. # -*- coding: utf-8 -*-
  3. __author__=”Khan”
  4. __date__ =”$23.Nis.2009 14:11:51$”
  5. import threading, zipfile;
  6. class AsyncZip(threading.Thread):
  7.      def __init__(self, inputfile, outputfile):
  8.           threading.Thread.__init__(self);
  9.           self.inputfile = inputfile;
  10.           self.outputfile = outputfile;
  11.     def run(self):
  12.          f = zipfile.ZipFile(self.outputfile,”w”,zipfile.ZIP_DEFLATED);
  13.          f.write(self.inputfile);
  14.          f.close();
  15.          print(“Zipleme işlemi tamamlandı:”, self.inputfile);
  16. bg = AsyncZip(“pythonText.txt”,”pythonText.zip”);
  17. bg.start();
  18. print (“Ana program çalışırken arka planda thread zipleme işlemini yaptı.”);

Kısaca açıklayacak olursak threading modülünü ve zipfile modüllerinden yararlanarak bir Class yazdık ve bu class’ın constructor’da 2 argument aldık. İlk argument ziplenecek dosyayı alıyor ve içerideki run function’ı ile zipliyor. İkinci argument yine run function’nın da çıktı olarak verilecek dosyanın adını oluşturuyor. Birde Join’i anlatıyım kısaca :)

Join’de ise main program thread’i bekledikten sonra işlemlerine devam ediyor. Buda şöyle bir senaryoda karşımıza çıkabilir. İlgili kişi’den bir dosya alıp bunu zipleyeceğimizi düşünün ve bu dosyanın önemli olduğunu farz edelim. Zipleme işleminde bir problem olursa UI Lock edip kullanıcıya hata mesajı dönmeliyiz. Eğer normal şekilde bir thread ile yaparsak işlemler olurken kullanıcı halen UI’i yönetebiliyor olacak. Join ile yaptığımızda main program Thread’i beklediğinden thread işini bitirmeden main program işlemlerine devam edemeyecek.

Bunuda test etmek isterseniz bg.start()’ın altındaki print’i kaldırarak aşağıdaki kodları ekleyin ve çıktısına bakınız.

  1. bg.join();
  2. print (“Ana program thread’i bekledi ve şimdi işlemlerine devam etti.”);

İyi Çalışmalar.

Kategoriler:Dökümanlar Etiketler:, ,
  1. Henüz yorum yapılmamış.
  1. No trackbacks yet.

Yorum bırakın