我有一些python代码来读取文件并将数据推送到列表 . 然后将此列表放入队列,使用线程处理列表,一次说20个项目 . 处理完毕后,我将结果保存到一个新文件中 . 放入新文件的内容实际上与原始文件的顺序不同 . 例如,我有输入,
1 a
2 b
3 c
4 a
5 d
但输出看起来像:
2 aa
1 ba
4 aa
5 da
3 ca
有没有办法保留原始订单?这是我的代码:
import threading,Queue,time,sys
class eSS(threading.Thread):
def __init__(self,queue):
threading.Thread.__init__(self)
self.queue = queue
self.lock = threading.Lock()
def ess(self,email,code,suggested,comment,reason,dlx_score):
#do something
def run(self):
while True:
info = self.queue.get()
infolist = info.split('\t')
email = infolist[1]
code = infolist[2]
suggested = infolist[3]
comment = infolist[4]
reason = infolist[5]
dlx_score = (0 if infolist[6] == 'NULL' else int(infolist[6]))
g.write(info + '\t' + self.ess(email,code,suggested,comment,reason,dlx_score) +'\r\n')
self.queue.task_done()
if __name__ == "__main__":
queue = Queue.Queue()
filename = sys.argv[1]
#Define number of threads
threads = 20
f = open(filename,'r')
g = open(filename+'.eSS','w')
lines = f.read().splitlines()
f.close()
start = time.time()
for i in range(threads):
t = eSS(queue)
t.setDaemon(True)
t.start()
for line in lines:
queue.put(line)
queue.join()
print time.time()-start
g.close()
1 回答
想到三个想法 . 所有共同点是包含一个索引,该索引包含排队等待处理的数据包 .
然后有人想到使用控制器/工作者/输出框架,其中输出线程将工作者处理的数据排队,组装并输出它 .
第二个想法是使用内存映射文件进行输出,并使用索引计算要写入文件的偏移量(假定可能采用固定长度写入) .
第三种方法是使用索引将处理过的数据放入新列表中,当列表完成时,将项目写在最后而不是动态 .