Konuyu Oyla:
  • Toplam: 0 Oy - Ortalama: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Threading Kullanımı
#1
Threading modülü python'da paralel işlem yapmamıza olanak sağlan kullanımı basit bir modüldür. Normade yazdığımız kodda bir işlem bitmeden bir diğerine geçmez. Ama threading ile aynı anda birden fazla işlem yapabiliriz.

Aşağıdaki kod, normal olarak "url_listesi" içeriğindeki her bir url adresini "indir" fonksiyonuna gönderip "sayi" ile dosya ismine ekleme yaparak "png1.png, png2.png ...." şeklinde sırası ile kaydetmemize yarayan basit bir dosya indirme kodudur. Kodu çalıştırınca siz de göreceksiniz ki birinci indirme işlemi bitmeden bir diğerine geçmez, indirmeleri teker teker yapar.

PHP Kod:
import urllib2

url_listesi 
= [
               "https://www.python.org/static/img/python-logo.png",
               "https://www.python.org/static/img/python-logo.png",
               "https://www.python.org/static/img/python-logo.png",
               "https://www.python.org/static/img/python-logo.png",
              ]
            
            
def indir(urlsayi):
    print 
sayi"indiriliyor..."
    
dosya open("png" str(sayi) + ".png""ab")
    
istek urllib2.urlopen(url)
    
    while 
True:
        
oku istek.read(1024)
        
dosya.write(oku)
        if 
not oku:
            break
        
    
dosya.close()

        
sayi 1

for url in url_listesi:
    
indir(urlsayi)
    
sayi += 


Peki biz bu indirme işlemini threading ile yapamaz mıyız? Tabki de yaparız. Threading ile yukarıdaki kodun yaptığını aynı anda yaparız, yani for döngüsü birinci indirme işleminin tamamlanmasını beklemeden ikinci indirme işlemini çağıracaktır, bu sayede indirmeler eş zamanlı gerçekleşmiş olacaktır.

Threading ile basit indirme kodu ise şu şekilde olacaktır:

PHP Kod:
import threading
import urllib2

url_listesi 
= [
 
              "https://www.python.org/static/img/python-logo.png",
 
              "https://www.python.org/static/img/python-logo.png",
 
              "https://www.python.org/static/img/python-logo.png",
 
              "https://www.python.org/static/img/python-logo.png",
 
             ]
            
            
def indir(urlsayi):
    print 
sayi"indiriliyor..."
    
dosya open("png" str(sayi) + ".png""ab")
    
istek urllib2.urlopen(url)
    
    while 
True:
        
oku istek.read(1024)
        
dosya.write(oku)
        if 
not oku:
            break
        
    
dosya.close()

        
sayi 1

for url in url_listesi:
    
threading.Thread(target indirargs=(urlsayi)).start()
    
sayi += 


Kodu çalıştırınca göreceksiniz ki png1, png2, png3 ve png4 dosyaları aynı anda açılacaktır ve indirmeleri de aynı anda olacaktır. Print ile ekrana bastığımız "indiriliyor.." bile ekrana aynı anda yazacaktır. Bu iki koddaki tek fark, for döngüsündeki "indir" adlı fonsiyonunu çağırma şeklimiz ("import threading" hariç)

1. kodda:
indir(url, sayi)
satırı ile fonksiyonu çağırdık

2. kodda ise:
threading.Thread(target = indir, args=(url, sayi)).start()
satırı ile indir fonksiyonunu çağırdık

Gördüğünüz gibi gayet basit. İyi kullanımlar...
Turbobit Premium Link Çeviri | Turbobit Link Generator | http://turbobit.qpython.club
Cevapla
#2
Aklıma bi fikir geldi Big Grin
Ara
Cevapla
#3
Klavyene sağlık üstad , bu burada dursun balık hafızalı olduğum için arada bakarım Big Grin
Ara
Cevapla
#4
eyvallah dadaş, valla ben konusu vardı diye biliyodum ama yokmuş Smile

(04-07-2018, Saat: 22:30)oktay811 Nickli Kullanıcıdan Alıntı:  Aklıma bi fikir geldi Big Grin

mümkünse senin aklına fikir gelmesin, ondan sonra herkesi bezdiriyon, kendin de beziyon Smile
Turbobit Premium Link Çeviri | Turbobit Link Generator | http://turbobit.qpython.club
Cevapla
#5
Bu arada ufak bir bilgilendirme daha yapayım, threading modülü ile eş zamanlı işlem yaptığımızda işlemci ve network kapasitesine göre sınırlama koymak gerekir. Bazen çok sayıda eş zamanlı iş parçacıkları kapasiteyi aştığı için hata alabiliriz, yani hepsi işlemeyebilir, hata verebilir. Eğer bu konudaki örnekte 100-200 tane indirme linki olsa muhtemelen kod hata verecektir, işlemci kaldırsa da network kaldırmadığından hata verebilir.

Bu durumda kendi içimizde threading sınırlaması koyarak kontrol altına alabiliriz.

"threading.activeCount()" bize aktif thread sayısını verir

PHP Kod:
..
..
..
# maksimum thread sayisini belirleyelim
maxthreads 10


for url in url_listesi:
    while 
threading.activeCount() >= maxthreads:            
        
time.sleep(0.3#saniyeyi kafaniza gore ayarlayabilirsiniz.
    
threading.Thread(target indirargs=(urlsayi)).start()
    
sayi += 
Turbobit Premium Link Çeviri | Turbobit Link Generator | http://turbobit.qpython.club
Cevapla
#6
gecemor Yanlış bişey yaptıysam özür dilerim.
Ara
Cevapla
#7
(04-07-2018, Saat: 23:53)oktay811 Nickli Kullanıcıdan Alıntı:  gecemor Yanlış bişey yaptıysam özür dilerim.

yok şaka takılıyorum ama ciddiyet payı da yok değil Smile mesela sana zamanında hep dedim şu python temel konuları tamamla diye, bak threading sana engel oldu. Demem o ki daha üst seviye kodlar yapmaya ve editlemeye çalışırken temel konularda eksiğin olduğun için kendin de uğraşıyosun, yerine göre bazı arkadaşları da uğraştırıyosun Smile
Turbobit Premium Link Çeviri | Turbobit Link Generator | http://turbobit.qpython.club
Cevapla
#8
şunu şuraya bırakayım Big Grin https://wiki.python.org/moin/GlobalInterpreterLock
Ara
Cevapla
#9
@excel ee nedir yani mevzu? "Aslında tam olarak eş zamanlı işlem yapamıyor GIL engel oluyor" falan diyeceksen yanlış konudasın veya yanlış forumda... Çünkü burda verdiğim örneğin basitliğine bakarak GIL tartışması gereksiz olacaktır.
Turbobit Premium Link Çeviri | Turbobit Link Generator | http://turbobit.qpython.club
Cevapla
#10
Tam onu diyecektim Big Grin

Örnekle bi alâkası yok, tartışma amaçlı da değil. Maksat bilgi olsun
Ara
Cevapla

{lang: 'en'}


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  PYTHON DO-WHILE KULLANIMI mustafa58 1 3,557 30-06-2017, Saat: 17:14
Son Yorum: asosyetikbiri
  split() kullanımı gecemor 8 8,331 13-11-2016, Saat: 01:50
Son Yorum: gecemor

Hızlı Menü:


Konuyu Okuyanlar: 1 Ziyaretçi
Change Theme