Python Multithread Kullanımı Ve Dosya Arama

Python ve PyQt maceralarımın son programı olan Araci için yeni bil algoritma yazmayı duşunuyordum.Çunku ilk versiyonda sadece belirttiğim klasorun altındaki dosyaların içinde kelime arıyordu.Benim yapmak istediğim ise belirttiğim dizinin altındaki dosyaların içine bakması ve diğer dizinlerinde yolunu rekursif olarak tekrar kendisine gondermesini istiyordum.Bu mantık doğruydu ve çalışıyordu.Ancak çok yuksek dizin ve klasore sahip yerlerde python hata verip kapanıyordu.Bende bunu çozmek için guzel bir async arama classı yazdım.Şimdilik işimi goruyor.Belki ilerde yeniden geliştirebilirim.

class AsyncArama(threading.Thread):
    def __init__(self, yer, kelime, uzanti):
        threading.Thread.__init__(self)
        self.yer = yer
        self.kelime = kelime
        self.uzanti = uzanti
        self.bulunan = []

    def run(self):

        def dosyalama(yer, uzanti):
            dosyalist = []

            for kok, altdizinler, dosyalar in os.walk(yer):
                for dosya in dosyalar:
                    if dosya.endswith(uzanti):
                        dosyalist.append(os.path.join(kok,dosya))   
            return dosyalist

        def aramayap(yer, kelime, uzanti):
            dosyalar = dosyalama(yer, uzanti)
            for dosya in dosyalar:
                try:
                    satirlar = open(dosya)
                    for satir in satirlar:
                        if satir.find(kelime) > 0:
                            if self.bulunan.count(dosya) == 0:
                                self.bulunan.append(dosya)  
                except:
                    pass                
        aramayap(self.yer, self.kelime, self.uzanti)                        
        return self.bulunan

Bu kod uzerinden pythonda multi-thread mantığınıda gostermek istiyorum.Diğer dillere nazaran Python'da bu olay çok çok kolay.Öncelikle threading modulunu import ettikten sonra ondan yararlanarak bir class oluşturuyoruz.Daha sonra bu class içine arguman gondereceksek onlarıda kodda gorunduğu şekilde ayarlıyoruz.Daha sonra kullanırken bu şekilde arguman yollayacağız.init fonksiyonunda adı uzerine kurulum yapılıyor.Class'ın tumunde kullanacağımız değişkenkenleri tanımlıyoruz.

Burada onemli olan run fonksiyonu.Çunku ilerde bu sınıfı kullanmak istediğimizde run fonksiyonu altındaki kodlar çalışacak.Ve daha sonra bu sınıfı kullanmak istediğimiz yere almaya geldi.

Araci v0.2

Ben PyQt ile oluşturduğum Araci isimli programımda aşağıdaki gibi kullandım.

aramath = AsyncArama(self.aramayeri, self.kelime, self.uzanti)
aramath.start()

if aramath.run():               
            for sonuc in aramath.run():
            self.listWidget.addItem(sonuc)
else:
            self.listWidget.addItem("Bulunamadi!")

Bu kodların Turkçe açıklaması şoyle.Aramayeri değişkenine belirttiğimiz yer ve onu tum alt dizinlerinde belirttiğiniz uzantıya sahip dosyalarda belirttiğiniz kelimeyi arıyor.Eğer buna uyanlar varsa geri donuş değeri olarak bu dosyaların konumunu bildiren bir liste geliyor.Bende bu gelen sonuclara gore listWidget'ıma bunları ekliyorum.Olay gayet basit.Python ve PyQt'de yazdığınız programlarda donma oluyorsa yukarıda kullandığım multi-thread mantığını sizde kullanın.Bu sayede hem gui ekranı donmuyor hemde işiniz çok daha hızlı bir şekilde yapılıyor.

Videoda gorduğunuz gibi program işimi gorecek seviyeye geldi.Tum kaynak kodları için github depoma bakabilirsiniz.

comments powered by Disqus