我有一个包含大量数据的文件。每一行都是一条记录。我正在尝试对整个文件进行一些 ETL 工作。现在我正在使用标准输入逐行读取数据。很酷的一点是,您的脚本可以非常灵活地与其他脚本和 shell 命令集成。我将结果写入标准输出。例如。
$ cat input_file
line1
line2
line3
line4
...
我当前的 python 代码看起来像这样 - 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
我查看了 Python 的 Threading 模块,我想知道如果我使用该模块,性能是否会显着提高。
问题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:多个线程可能同时将结果打印回stdout,如何组织,避免出现以下情况?
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