PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Python & Threads


The_Invisible
2006-10-27, 09:00:18
habe ein kleines tool zum importieren von dns daten in mydns geschrieben. da einzelnes abarbeiten sehr lange dauert habe ich das ganze in threads unterteilt. funktioniert auch sehr gut, allerdings kommt es in 10% der durchläufe vor das sich ein thread nicht beendet und somit das ganze programm hängt.

hier mal der revelante codeteil:


...

DomainPool = Queue.Queue(0)

...

class importDomains(threading.Thread):
def run(self):
domain = DomainPool.get()
i = 0

# MySQL mydns / soa
con2 = MySQLdb.Connect(host="172.16.20.138", port=3306, user="***", passwd="***", db="mydns")
cursor2 = con2.cursor()

cursor2.execute("SET NAMES utf8")

print self.getName() + " -> start"

while domain != None:
# Import ausführen
CMD_IMPORT_EXECUTE = CMD_IMPORT.replace("{DOMAIN}",arrData[domain]['Domain'])
print self.getName() + ": Domain " + arrData[domain]['Domain'] + " importiert."
#os.system(CMD_IMPORT_EXECUTE)

# Datenbank updaten mit KCODE, RCODE, BCODE
# cursor2.execute("UPDATE soa SET KCODE='" + arrData[domain]['KCODE'] + "',RCODE='" + arrData[domain]['RCODE'] + "',BCODE='" + arrData[domain]['BCODE'] + "' WHERE origin='" + arrData[domain]['Domain'] + ".'")
print self.getName() + ": Domain " + arrData[domain]['Domain'] + " updated. (" + str(arrData[domain]) + ")"

i += 1

try:
domain = DomainPool.get_nowait()
except:
print self.getName() + " -> Domains importiert: " + str(i)
break

con2.close()
print self.getName() + " -> end"
sys.exit()

# Starte 4 Threads
for i in range(0,4):
idomain = importDomains()
idomain.start()


es wird also immer ein element aus der queue genommen und bearbeitet, wenn kein element mehr vorhanden ist wirft er ne exception und sollte den thread mit der ausgabe der anzahl der bearbeitenden elemente verlassen.

je mehr threads ich zudem starte desto größer ist die wahrscheinlichkeit das das programm hängt. da ich mit threads noch nicht viel am hut hatte würde ich mich freuen wenn mir jemand ein paar tipps geben würde.

mfg