首页 文章

在python中使用线程时如何保留文件写入顺序

提问于
浏览
0

我有一些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 回答

  • 3

    想到三个想法 . 所有共同点是包含一个索引,该索引包含排队等待处理的数据包 .

    • 然后有人想到使用控制器/工作者/输出框架,其中输出线程将工作者处理的数据排队,组装并输出它 .

    • 第二个想法是使用内存映射文件进行输出,并使用索引计算要写入文件的偏移量(假定可能采用固定长度写入) .

    • 第三种方法是使用索引将处理过的数据放入新列表中,当列表完成时,将项目写在最后而不是动态 .

相关问题