2010-10-16 4 views
5

Ich habe eine Python-Anwendung, die, um kurz zu sein, Daten von einem Remote-Server empfängt, verarbeitet, reagiert auf den Server und speichert gelegentlich die verarbeiteten Daten auf der Festplatte. Das Problem, das ich festgestellt habe, ist, dass es eine Los von Daten zum Schreiben gibt, und der Speichervorgang kann über eine halbe Minute dauern. Dies ist offensichtlich ein Blockiervorgang, so dass das Netzwerk-IO während dieser Zeit angehalten wird. Ich würde gerne in der Lage sein, den Speichervorgang sozusagen im Hintergrund ablaufen zu lassen, damit die Anwendung weiterhin schnell mit dem Server kommunizieren kann.Welches Threading-Modul sollte ich verwenden, um zu verhindern, dass die Festplatten-IO den Netzwerk-IO blockiert?

Ich weiß, dass ich wahrscheinlich eine Art von Threading-Modul benötigen, dies zu erreichen, aber ich kann nicht sagen, was sind die Unterschiede zwischen thread, threading, multiprocessing und die verschiedenen anderen Optionen. Weiß jemand, wonach ich suche?

+1

verwandt: http://stackoverflow.com/questions/2629680/deciding-between-subprocess-multiprocessing-and-thread-in-python –

Antwort

6

Da Sie E/A-gebunden sind, verwenden Sie das Modul threading.

Sie sollten fast nie thread verwenden, es ist eine Low-Level-Schnittstelle; Das threading-Modul ist ein High-Level-Interface-Wrapper für thread.

Das Modul multiprocessing unterscheidet sich vom Threading-Modul, multiprocessing verwendet mehrere Unterprozesse zum Ausführen einer Aufgabe; multiprocessing passiert zufällig die gleiche Schnittstelle wie threading, um Lernkurve zu reduzieren. multiprocessing wird normalerweise verwendet, wenn Sie über eine CPU-gebundene Berechnung verfügen und die GIL (Global Interpreter Lock) in einer Multicore-CPU vermeiden müssen.

Eine etwas esoterischere Alternative zu Multithreading ist die asynchrone E/A mit asyncore Modul. Weitere Optionen sind Stackless Python und Twisted.

+1

(Sorry für die Änderung) Ich wollte nur darauf hinweisen, dass diese Antwort nicht vollständig ist insbesondere in Bezug auf Festplatten-E/A. Asynchronous Disk I/O unterscheidet sich von Nonblocking: Blockieren bezieht sich auf einen Systemaufruf, der keine Antwort hat und garantiert Zeit braucht - mit anderen Worten, Netzwerk und Pipe-I/O. Beim Lesen von der Festplatte wird der E/A jedoch niemals "blockieren": Er könnte langsam sein. Asyncore und Twisted Fokus auf nicht blockierende I/O so kann in dieser Situation nicht helfen. Threads * sollten * helfen, aber ich wurde von der GIL mit Disk-I/O gebissen ... Fühlen Sie sich frei, mich diesbezüglich zu korrigieren. –