For içinde thread modülü

```with open('xx.txt','r+') as p:
    sayi = p.readlines()
    c = 0
    for a in range(0,len(sayi),25):
        if c==okusayi:
            break
        else:
            if c > 0:
                cikar = (a - 25)
                #print(a)
                parca = oku[c].split('.')
                ad = parca[0]
                soyad = parca[1]
                soyadparca = soyad.split('@')
                soyad = soyadparca[0]
                soy = re.sub(r"(\d+)","",soyad)
                hesapparcala = oku[c].split('&')
                email = hesapparcala[0].replace("\n","").strip()
                sifre = hesapparcala[1].replace("\n","").strip()
                kullanici = hesapparcala[2].replace("\n","").strip()
                ip = hesapparcala[3].replace("\n","").strip()
                port=hesapparcala[4].replace("\n","").strip()
                useragent = hesapparcala[5].replace("\n","").strip()
                rastgele = random.randint(1,8)
                with open('./klasor/'+str(rastgele)+'.txt') as k:
                    mesaj = k.readlines()
                    mami = mesaj[0]+" ( "+email+ " )"
                threads = []
                th1 = Thread(target=gonder, args=(email,sifre,ip,port,useragent,cikar,a,mami))
                threads.append(th1)
                th1.start()
                for thread in threads:
                    thread.join()
                    
        c += 1
    p.close()
    h.close()```

Arkadaşlar merhaba yeni üye oldum. thread yukarıdaki kodla çalıştırıyorum fakat ben 5 thread açarak yapmak istiyorum. Şimdi for içinde olduğundan ve gönderilen argümanlar sürekli değişiyor. 2 thread açtığım zaman 1. thread ile aynı işlemi yapıyor. 5 thread açsam 5 tane aynı işlem yapmış olacağım. Benim amaçım 5 thread açıp her bir thread da farklı işlem uygulamak zamandan tasarruf etmek istiyorum.Yani derdimi anlatabildinmi bilmiyorum ama lütfen yardımcı olun.

Kodunuzu pek anlayamadım. Neden thread’leri ana for döngüsü içinde tekrar tekrar join ediyorsunuz? Şu satırlardan bahsediyorum:

...
                for thread in threads:
                    thread.join()
...

Hocam kodla çok uğraştığımdan öyle kalmış. Kullanma sebebim 5 thread açtığım zaman for döngüsü ile tüm threadları sıraya alıyorum kısacası. Yanlış bir kullanımmı yaptım acaba. Ayrıca for içinde 5 thread nası çalıştırabilirim bu konuda fikirleriniz varsa yardım rica ediyorum.

Yokmu arkadaşlar yardımcı olucak :slight_smile:

Bu şekilde çalıştırılıyor aslında. Kodunuzda yanlış bir şey göremedim. Ancak join ile ilgili yanlış bir kullanım olabilir. join kullanmadığınızda istediğinizi elde ediyor musunuz?

1 Beğeni

Şimdi hocam yukarıdaki kod bloğu. Selenium a değer gönderiyor. Seleniumda verilen testi çalıştırıyor. Fakat bir sürü test var. Saatlerce sürüyor. Ben seleniuma 5 tarayıcı sekmesi açtırıp işleri çok daha az zamanda halletmeye çalışıyorum. Kod çalışıyor ama 1 sekme açıyor. Ben 5 thread açtığımda hepsi aynı işlemi yapıyor. Ben 5 thread açsamda her thread farklı işlem yapmasını istiyorum.

Ayrıca join kullanmadığımda pc kasıyor çalışmıyor. Join kullanmak durumunda kalıyorum.


if name == “main”:
procs = 4
jobs = []
for i in range(0, procs):
process = multiprocessing.Process(target=gonder,args=(email,sifre,ip,port,useragent,cikar,a,mami))
jobs.append(process)
for j in jobs:
j.start()
for j in jobs:
j.join()

Bu şekilde ekliyorum mesala. Fakat for içinde olduğundan 4 kere aynı işlem üstünde çalışıyor. Umarım anlatabilmişimdir.

Girintilemeyi düzeltebilir misiniz? Böyle bir şey anlamak zor.

 with open('xxx.txt','r+') as p:
    sayi = p.readlines()
    c = 0
    for a in range(0,len(sayi),8):
        #print(c)
        if c==okusayi:
            break
        else:
            if c > 0:
                cikar = (a+1 - 8)
                #print(a)
                #print(cikar,a)
                parca = oku[c].split('.')
                ad = parca[0]
                soyad = parca[1]
                soyadparca = soyad.split('@')
                soyad = soyadparca[0]
                soy = re.sub(r"(d+)","",soyad)
                hesapparcala = oku[c].split('&')
                email = hesapparcala[0].replace("n","").strip()
                sifre = hesapparcala[1].replace("n","").strip()
                kullanici = hesapparcala[2].replace("n","").strip()
                ip = hesapparcala[3].replace("n","").strip()
                port=hesapparcala[4].replace("n","").strip()
                useragent = hesapparcala[5].replace("n","").strip()
                rastgele = random.randint(1,8)
                with open('./klasor/'+str(rastgele)+'.txt') as k:
                    mesaj = k.readlines()
                    mami = mesaj[0]+" ( "+email+ " )"
                print(c,email,cikar,a)
               threads = []
               th1 = Thread(target=gonder, args=(email,sifre,ip,port,useragent,cikar,a,mami))
               th2 = Thread(target=gonder, args=(email,sifre,ip,port,useragent,cikar,a,mami))
               th3 = Thread(target=gonder, args=(email,sifre,ip,port,useragent,cikar,a,mami))
               threads.append(th1)
               threads.append(th2)
               threads.append(th3)
               th1.start()
               th2.start()
               th3.start()
               for thread in threads:
                     thread.join()
                #gonder(email,sifre,ip,port,useragent,cikar,a,mami)
              
        c += 1
	```

Buyurun hocam, tam olarak kodum budur.

Buyur hocam kod aynen bu şekilde. Şimdi for içinde her dönüşte 3 farklı bilgi ve sıra bozulmadan, göndermem lazım fonksiyona.

Amacınız bir dosyadan satırları tek tek çekerek, bunları parçalayıp işlem yapmak mı?

Evet hocam. Satırları tek tek gönderiyorum fonksiyona. Fakat 3 thread açınca hepsi aynı işlemi yapıyor. Tek değer gönderincede saatlerce sürüyor.

Hocam bu fonksiyon selenium modülüne değer gönderiyor. Tarayıcı penceresi açılıyor, test bitince kapanıyor sonraki test başlıyor. Amaç bu. Ben her for döngüsünde 5 pencere açmak istiyorum. Ve bu 5 penceredeki testler farklı kullanıcıların testleri olacak.

Bu kod işinizi görür mü?

import random
import threading
from queue import Queue

q = Queue()

def parcala(x):
	#gerekli İşlemleri burada yapabilirsin
	print(x+" Parcalandi")

def oku():
	while not q.empty():
		string = q.get()
		parcala(string)

with open("test.txt","r") as f:
	read = f.readlines()
	for i in read:
		q.put(i)
for i in range(5):
	th1 = threading.Thread(target = oku)
	th1.start()

bir deneme yapacağım hocam.

Hocam sanırım bu işe yarayacak. Birşey merak ediyorum.

Benim txt dosyamın her satırı şu şekilde.

kullaniciadi@email.com&sifre&ip&port&useragent

bu şekilde. Ben bu oku fonksiyonu içinde parçalasam bu txt yi parcala fonksiyonuna tüm değerleri tek tek gönderebilirim sanırım dimi yanlış düşünmüyorum.

import threading
from queue import Queue
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time, re,keyboard,string


q = Queue()

def parcala(x):
    #gerekli İşlemleri burada yapabilirsin
    browser = webdriver.Firefox()
    browser.maximize_window()
    #browser.set_window_size(1456,876)
    browser.get('https://www.google.com.tr')
    time.sleep(5)
    browser.find_element_by_name("q").send_keys(x)
    print(x+" Parcalandi")

def oku():
    while not q.empty():
        string = q.get()
        parcala(string)

with open("x.txt","r") as f:
    read = f.readlines()
    for i in read:
        q.put(i)
        
for i in range(5):
    th1 = threading.Thread(target = oku)
    th1.start()

Elbette.Herhangi bir sorun olmaz.

1 Beğeni

Ya hocam çok teşekkür ederim. Beni büyük sıkıntıdan kurtardın. İşlerin yolunda gitsin inşallah sağol varol.

1 Beğeni

Önemli değil. Teşekkür ederim. Çözüldü olarak işaretlerseniz diğer kullanıcılar için de yararlı olur.

1 Beğeni