2016-07-14 4 views
0

Ich habe ein Python-Skript, also verwende ich Threading-Modul in Python, um gleichzeitig auszuführen.Python Threading hat nicht alle Threads ausgeführt, die erstellt

class check_bl(threading.Thread): 
    def __init__(self, ip_client, reverse_ip, key, value): 
     threading.Thread.__init__(self) 
     self.ip_client = ip_client 
     self.reverse_ip = reverse_ip 
     self.key = key 
     self.value = value 

def run (self): db = MySQLdb.connect ('lokalen Host', 'Mytable', 'user', 'Mytable') cursor = db.cursor() = Abfrage „dig + kurz "+ str (reverse_ip) +". " + Taste Versuch: output = subprocess.check_output (Abfrage, shell = True) output_edited = output.strip() Ausnahme: output_edited = "Timeout aufgetreten"

if output_edited in value: 
     try: 
      cursor.execute() # execute INSERT command 
      db.commit() 
     except: 
      db.rollback() 
     db.close() 
    else: 
     try: 
      cursor.execute() # execute INSERT command 
      db.commit() 
     except: 
      db.rollback() 
     db.close() 

für ip_client in ipNetwork (range_ip_client) : ip_client = .... reverse_ip = ...

for key, value in my_dictionary.items(): 
    myThread = check_bl(ip_client, reverse_ip, key, value) 
    myThread.start() 
    threadList.append(myThread) 

for t in threadList: 
t.join() 

Das Problem ist, die jeweils einige Schlüssel, Wert in my_dictionary nicht (nicht zu Datenbank INSERT hat ausführen, obwohl einige Schlüssel, valu e führen mehr als einmal aus). Mein Wörterbuch hat 30 Elemente, aber nur 10 - 20 von ihnen ausführen. Wenn ich join() wie 2 Beispiel unten einfügen, alle meine Wörterbuch item() ausführen, aber zur gleichen Zeit, nur einen Thread ausführen. Ist bei jedem erstellten Thread etwas falsch, wird eine Datenbankverbindung erstellt. Die Datenbank kann damit nicht umgehen.

for key, value in my_dictionary.items(): 
    myThread = check_bl(ip_client, reverse_ip, key, value) 
    myThread.start() 
    threadList.append(myThread) 

for t in threadList: 
    t.join() 

oder

for key, value in my_dictionary.items(): 
    myThread = check_bl(ip_client, reverse_ip, key, value) 
    myThread.start() 
    t.join() 

Dank DKSJ, ist mein Problem gelöst. Vielleicht stimmt etwas mit der Klassenmethode nicht, Sie müssen nur eine Funktion definieren.

def check_bl(ip_client, reverse_ip, key, value): 
    db = MySQLdb.connect('localhost', 'mytable', 'user', 'mytable') 
    cursor = db.cursor() 
    query = "dig +short " + str(reverse_ip) + "." + key 
    try: 
     output = subprocess.check_output(query, shell=True) 
     output_edited = output.strip() 
    except: 
     output_edited = "Timeout occured" 

    if output_edited in value: 
     try: 
      cursor.execute() # execute INSERT command 
      db.commit() 
     except: 
      db.rollback() 
     db.close() 
    else: 
     try: 
      cursor.execute() # execute INSERT command 
      db.commit() 
     except: 
      db.rollback() 
     db.close() 

for ip_client in IPNetwork(range_ip_client): 
    ip_client = .... 
    reverse_ip = ... 
    for key, value in my_dictionary.items(): 
     myThread = check_bl(ip_client, reverse_ip, key, value) 
     threadList.append(myThread) 

[t.start() for t in threadList] 

[t.join() for t in threadList] 

Antwort

0

Mein Problem ist gering anders Ihres und ich habe nicht Klassenmethode verwenden ich Ihren Code nur geändert basierend auf Mine können Sie versuchen. Dieser Link hat mir geholfen, mein Problem zu lösen: How to use threading in Python?

def check_bl (ip_client, reverse_ip, Schlüssel, Wert): ....

threads [] 
for key, value in my_dictionary.items(): 
    # Instantiates the thread 
    myThread = Thread(target=check_bl, args=(ip_client, reverse_ip, key, value)) 
    #add thread to list 
    threads.append(myThread) 

[th.start() for th in threads] 
#Join all the threads to make sure the parent waits for all of them to finish 
[th.join() for th in threads] 
+0

Obwohl dieser Code Hilfe sein kann, das Problem zu lösen, Bereitstellung zusätzlicher Kontext in Bezug auf _why_ und/oder _how_ it Antworten die Frage würde deutlich verbessern langfristigen Wert. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erläuterung zu hinzuzufügen. –

+0

Ich habe es versucht, kann aber keinen Thread anhängen, der nicht gestartet wurde. –

+0

Vielen Dank, ich habe mein Problem gelöst, indem ich Ihrem Code folge. Genau, definiere einfach eine Funktion, brauche keine Klassenmethode. Ich werde meinen bearbeiteten Code oben veröffentlichen. –