Python Threading stdin/stdout

Ich habe eine Datei, die enthält eine Menge von Daten. Jede Zeile ist ein Datensatz. Und ich bin versucht zu tun, einige ETL-Arbeit gegen die ganze Datei. Jetzt bin ich mit standard-input zum Lesen der Daten Zeile für Zeile. Die kühle Sache über dieses ist, Ihr Skript könnte sehr flexibel sein, um die Integration mit anderen script-und shell-Befehle. Ich Schreibe das Ergebnis auf die Standardausgabe. Zum Beispiel.

$ cat input_file
line1 
line2
line3
line4
...

Meine aktuelle python-code sieht wie folgt aus - parse.py

import sys
for line in sys.stdin:
    result = ETL(line)    # ETL is some self defined function which takes a while to execute.
    print result

Den code unten ist, wie es funktioniert jetzt:

cat input_file | python parse.py > output_file

Ich habe mir das Threading-Modul von Python und ich Frage mich, ob das würde die Leistung drastisch verbessert, wenn ich das Modul.

Frage 1: Wie sollte ich planen die Quoten für jeden thread, warum?

...
counter = 0
buffer = []
for line in sys.stdin:
    buffer.append(line)
    if counter % 5 == 0:   # maybe assign 5 rows to each thread? if not, is there a rule of thumb to determine
        counter = 0
        thread = parser(buffer)
        buffer = []
        thread.start() 

Question2: Mehrere Threads, vielleicht drucken Sie das Ergebnis wieder auf stdout zur gleichen Zeit, wie Sie zu organisieren und zu vermeiden, die situation da unten?

import threading
import time

class parser(threading.Thread):
    def __init__ (self, data_input):
        threading.Thread.__init__(self)
        self.data_input = data_input

    def run(self):
        for elem in self.data_input:
            time.sleep(3)
            print elem + 'Finished'

work = ['a', 'b', 'c', 'd', 'e', 'f']

thread1 = parser(['a', 'b'])  
thread2 = parser(['c', 'd'])
thread3 = parser(['e', 'f'])

thread1.start()
thread2.start()
thread3.start()   

Die Ausgabe ist wirklich hässlich, wo eine Zeile enthält, die Ausgänge von zwei threads.

aFinished
cFinishedeFinished

bFinished
fFinished
dFinished
Könnten Sie den link "Threading-Modul von Python". Jedenfalls threading ist nicht eine gute Sache zu haben, beim Zugriff auf eine Datei, IMHO. Sie müssen definieren, was core zugreifen kann, was und Wann durch sperren und Semaphoren und das funktioniert. Wahrscheinlich würden Sie nicht eine große Leistungssteigerung, da die meisten die Arbeit, die I/O arbeiten, nicht die CPU die Arbeit.

InformationsquelleAutor B.Mr.W. | 2013-08-21

Schreibe einen Kommentar