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]
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. –
Ich habe es versucht, kann aber keinen Thread anhängen, der nicht gestartet wurde. –
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. –