У меня есть файл, который содержит много данных. Каждая строка - это запись. И я пытаюсь сделать некоторую работу ETL против всего файла. Сейчас я использую стандартный ввод для чтения данных по строкам. Замечательная вещь об этом - ваш скрипт может быть очень гибким, чтобы интегрироваться с другими командами сценария и оболочки. Я пишу результат на стандартный вывод. Например.Python Threading stdin/stdout
$ cat input_file
line1
line2
line3
line4
...
Мой текущий код питона выглядит следующим образом - 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
ниже код, как он работает прямо сейчас:
cat input_file | python parse.py > output_file
Я посмотрел на модуль Threading Python, и мне интересно, будет ли производительность значительно улучшена, если я буду использовать этот модуль.
Вопрос 1: Как я должен планировать квоты для каждой темы, почему?
...
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()
Вопрос2: Множественные нити может распечатать результат обратно на стандартный вывод в то же время, как организовать их и избежать ситуации ниже?
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()
Выход действительно некрасиво, где одна строка содержит выходы из двух потоков.
aFinished
cFinishedeFinished
bFinished
fFinished
dFinished
Не могли бы вы связать «Threading module of Python». Во всяком случае, нить не очень хорошо иметь при доступе к файлу, ИМХО. Вам нужно определить, к какому ядру можно получить доступ к тому, что и когда происходит через блокировки и семафоры и работы. Возможно, вы не увидите большого повышения производительности, поскольку большая часть работы связана с работой ввода-вывода, а не с работой ЦП. –