Bir program hazırladım. Bin adet thread başlatıyorum daha sonrasında bu bin adeti bitirmesini uyguluyorum ardından bir sonraki bin adete geçiş yapıyor. Requests ile sorgu yaptırıyorum. Ancak şöyle bir sorun yaşıyorum. Belli bir süre sonra bu program duruyor. Sebepsizce takılıyor bir thread işleminde.
Çok fazla denemeler yaptım en sonunda kullandığım sunucu firmasını değiştirdim. Orada bu sorunu yaşamıyorum.
Ancak şöyle bir durum var.
Eski sunucum 32 gb ram 8 çekirdekli ve internet hızı gayet iyi olan bir sunucu.
Yeni sunucum ise 4 gb ram 3 çekirdek onunda internet hızı iyi ama eskisinde daha yüksek hızı vardı.
Yani anlayacağınız yeni sunucum eskisine göre daha düşük kapasiteye sahip. Haliyle yeni sunucumda threadlar bir tık yavaş ama bir yerde durmuyor. Ben şimdi bu firmadan özelliklerini yükseltirsem daha iyi verim alacağım.
Konuyu çok uzattım biliyorum kusura bakmayın. Asıl sorum şu
Sebebi nedir? İşlemci modelinin farklı olması bu thread konusunda bir farklılık yaratıyor mu?
Programın durup durmaması üzerinde bir etkisi olmamalı, hayır.
1000 thread çok yüksek bir miktar. Python’da multithreading OS thread’ları tarafından birebir desteklendiği için işletim sistemine fazla yük biniyor olabilir. Ayrıca GIL, Python kodunuzun birden fazla thread kullanarak gerçek anlamda bir performans kazancı sağlamasını engeller. Siz concurrent I/O yapmaya çalışıyorsunuz, sizi sınırlayan etken işlemci gücü değil. Ben multithreading kullanmak yerine asenkron sorgu yapan bir kütüphane kullanmanızı tavsiye ederim.
import threading
def fonksiyon():
pass
data = []
liste = []
a = 0
for i in liste:
a += 1
data.append(threading.Thread(target=fonksiyon, args=(a,i)))
if a == 1000:
for th in data:
th.start()
for th in data:
th.join()
a = 0
data.clear()
if len(data)>0:
for th in data:
th.start()
for th in data:
th.join()
data.clear()
Böyle bir şey hazırlamıştım. Daha sonrasında eski vds te bir sorun olmadığını farkettim. Sorunu şu şekilde çözdüm.
import threading
import time
def fonksiyon():
pass
liste = []
a = 0
for i in liste:
a+=1
threading.Thread(target=fonksiyon, args=(a,i)).start()
time.sleep(0.01)