Viele threads zu schreiben, log-Datei zur gleichen Zeit in Python
Ich Schreibe ein Skript zum abrufen von WMI-Informationen aus vielen Computern gleichzeitig, dann schreiben Sie diese Informationen in einer text-Datei:
f = open("results.txt", 'w+') ## to clean the results file before the start
def filesize(asset):
f = open("results.txt", 'a+')
c = wmi.WMI(asset)
wql = 'SELECT FileSize,Name FROM CIM_DataFile where (Drive="D:" OR Drive="E:") and Caption like "%file%"'
for item in c.query(wql):
print >> f, item.Name.split("\\")[2].strip().upper(), str(item.FileSize)
class myThread (threading.Thread):
def __init__(self,name):
threading.Thread.__init__(self)
self.name = name
def run(self):
pythoncom.CoInitialize ()
print "Starting " + self.name
filesize(self.name)
print "Exiting " + self.name
thread1 = myThread('10.24.2.31')
thread2 = myThread('10.24.2.32')
thread3 = myThread('10.24.2.33')
thread4 = myThread('10.24.2.34')
thread1.start()
thread2.start()
thread3.start()
thread4.start()
Das problem ist, dass alle threads gleichzeitig schreibend.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie einfach erstellen Sie Ihre eigenen locking-Mechanismus, um sicherzustellen, dass nur ein thread je eine Datei schreiben.
Möchten Sie vielleicht zu prüfen, die Platzierung der Sperre um die gesamte for-Schleife
for item in c.query(wql):
zu erlauben, jeden thread zu tun, ein größeres Stück Arbeit, bevor die Freigabe der Sperre.print
ist nicht thread-sicher. Verwenden Sie dielogging
- Moduls (welches):Ausgang (und Inhalt
results.log
):Statt den Standardnamen zu verwenden (
Thread-n
), können Sie Ihre eigenen Namen mit dername
Schlüsselwort-argument, das die%(threadName)
Formatierung Richtlinie dann nutzen dann:(In diesem Beispiel wurde angepasst von einem Beispiel aus Doug Hellmann ' s ausgezeichneten Artikel über die
threading
- Modul)Andere Lösung, verwenden Sie ein
Pool
berechnen von Daten, die Rückgabe an den übergeordneten Prozess. Dieser Elternteil dann schreibt alle Daten in eine Datei. Da gibt es nur ein proc schreiben, die Datei in einer Zeit, gibt es keine Notwendigkeit für eine zusätzliche Sicherung.Beachten Sie die folgenden verwendet einen pool von Prozesse, nicht threads. Dies macht den code viel einfacher und leichter, als wenn man etwas zusammen mit der
threading
Modul. (Es ist einThreadPool
Objekt, es wird aber nicht dokumentiert.)Quelle
Ausgang results.txt