In Python kann das Definieren einer Methode direkt aufgerufen werden, aber das Erstellen eines Threads zum Aufrufen kann zu Fehlern führen. Dieses Phänomen tritt häufig bei der Verwendung von COM-Objekten für Systemoperationen auf und wird in Form von Threads aufgerufen.
Die Ausnahmeaufforderung lautet wie folgt:
syntax error。WMI returned a syntax error: you're probably running inside a thread without first calling pythoncom.CoInitialize[Ex] (no underlying exception)
Wenn Sie genau hinschauen, wurde die Lösung in der Ausnahmeaufforderung angegeben. Wenn Sie einen Thread ausführen, müssen Sie die Methode pythoncom.CoInitialize() aufrufen. Ich habe das WMI-Modul in meinem Programm verwendet, um zu versuchen, einige Systeminformationen abzurufen.
Die Ursache der Ausnahme (vermutlich) ist ein Problem mit dem COM-Mechanismus. Da der COM-Mechanismus es zwei beliebigen Komponenten ermöglicht, miteinander zu kommunizieren, ohne sich darum kümmern zu müssen, auf welcher Art von Computer sie ausgeführt werden, auf welchem Betriebssystem sie ausgeführt werden oder in welcher Sprache die Komponente kompiliert ist, ist dies COM Technologie kraftvoll. Der Zweck der Initialisierung der COM-Umgebung besteht darin, dafür zu sorgen, dass die API, die COM aufruft, ordnungsgemäß funktioniert, d und verwenden Sie CoUninitialize, um das Objekt beim Beenden freizugeben.
Fall:
c === send = 0.0 t += float(t.BytesReceivedPersec) / 1024 / 1024+= float(t.BytesSentPersec) / 1024 / 1024 rec, send
Dieser Code dient dazu, Upstream- und Downstream-Verkehr basierend auf der Netzwerkkarte des Computers zu erhalten (d. h. senden). Datenverkehr und Datenverkehr empfangen), ist es in Ordnung, direkt auszuführen. Bei Verwendung in der Get- oder Post-Methode des RequestHandlers von Tornado werden jedoch ein Ausnahmesyntaxfehler und zugehörige Eingabeaufforderungen ausgelöst. In RequestHandler wird die Post- oder Get-Anfrage als Hintergrund-Thread-Methode betrachtet, daher muss com vor der Instanziierung der WMI-Com-Komponente instanziiert werden.
Warum wird die Post- oder Get-Anfrage in RequestHandler als Hintergrund-Thread-Methode betrachtet? Dieses Problem lässt sich anhand des Codes erkennen, der Tornado verwendet. Der Code lautet wie folgt:
if __name__ == '__main__': app = tornado.web.Application( handlers=[(r"/test/(\w+)", testHandler), (r'/', MainHandler)] ) server = tornado.httpserver.HTTPServer(app) server = server.listen(8848) tornado.ioloop.IOLoop.instance().start();
Nachdem wir die Routing-Regeln für Tornado konfiguriert hatten, starteten wir den httpserver-Dienst und erstellten schließlich einen Prozess zum Ausführen von Tornado. Jede Post- oder Get-Anfrage ruft den entsprechenden Handler über Routing auf, das im Thread ausgeführt wird. Wenn der Systemverkehr über die WMI-Com-Komponente abgerufen und in die Get-Methode eingefügt wird, wird daher ein Fehler gemeldet. Die Änderung lautet wie folgt:
def get(self): res = {} pythoncom.CoInitialize() c = wmi.WMI() interfaces = c.Win32_PerfRawData_Tcpip_NetworkInterface() print len(interfaces) rec = send = 0.0 for t in interfaces: print t.Name rec += float(t.BytesReceivedPersec) / 1024 / 1024 send += float(t.BytesSentPersec) / 1024 / 1024 print rec, send res["receive"] = "%.2f" % rec res["send"] = "%.2f" % send self._write_json(res)
Es gibt viele Typen im Modul (Typen haben auch viele Attribute), was bei spezifischer Verwendung sehr mühsam abzufragen ist. Der statistische Datenverkehr verwendet in diesem Fall Win32_PerfRawData_Tcpip_NetworkInterface, und es gibt auch Lösungen, die Win32_PerfRawData_Tcpip_TCPv4 verwenden. Bitte wählen Sie entsprechend der tatsächlichen Situation aus.
Das obige ist der detaillierte Inhalt vonLösung des Problems, dass Python-Methoden nicht in Threads verwendet werden können. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!