Python Filetage stdin/stdout

J'ai un fichier qui contient beaucoup de données. Chaque ligne est un enregistrement. Et je suis en train de faire quelques ETL à l'encontre de l'ensemble du fichier. Maintenant je suis à l'aide de l'entrée standard pour lire les données ligne par ligne. La chose cool à propos de ce est votre script peut être très flexible pour s'intégrer avec d'autres scripts et des commandes du shell. J'ai écrit le résultat sur la sortie standard. Par exemple.

$ cat input_file
line1 
line2
line3
line4
...

Mon code python ressemble à ceci - 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

Le code ci-dessous est de savoir comment il fonctionne maintenant:

cat input_file | python parse.py > output_file

J'ai regardé le Filetage module de Python et je me demande si le rendement est amélioré de façon spectaculaire si j'utilise ce module.

Question1: Comment dois-je planifier les quotas pour chaque thread, pourquoi?

...
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: Plusieurs Threads peuvent s'imprimer le résultat sur la sortie standard stdout dans le même temps, la façon de les organiser et d'éviter la situation ci-dessous?

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()   

La sortie est vraiment laid, où une ligne contient les résultats de deux threads.

aFinished
cFinishedeFinished

bFinished
fFinished
dFinished
Pourriez-vous un lien Threading "module de Python". En tout cas, le filetage n'est pas une bonne chose d'avoir tout en accédant à un fichier, à mon humble avis. Vous avez besoin de définir ce qui peut accéder à quoi et quand, à travers les serrures et les sémaphores et les travaux. Probablement, vous ne les verrez pas un grand gain de performance, en raison de la plupart des travaux en cours de l'I/O de travail, pas de CPU à travailler.

OriginalL'auteur B.Mr.W. | 2013-08-21