0

我有一些 python 代码来读取文件并将数据推送到列表中。然后将此列表放入队列,使用线程处理列表,一次说 20 个项目。处理后,我将结果保存到一个新文件中。新文件中的内容实际上与原始文件的顺序不同。例如,我有输入,

    1个
    2 乙
    3℃
    4个
    5天

但输出看起来像:

    2个氨基酸
    1巴
    4个氨基酸
    5天
    3 约

有什么办法可以保留原来的顺序吗?这是我的代码:

    导入线程、队列、时间、系统
    类 eSS(threading.Thread):
        def __init__(self,queue):
            threading.Thread.__init__(self)
            self.queue = 队列
            self.lock = threading.Lock()
        def ess(自我,电子邮件,代码,建议,评论,原因,dlx_score):
            #做点什么
        定义运行(自我):
            而真:
                信息 = self.queue.get()
                infolist = info.split('\t')
                电子邮件 = 信息列表 [1]
                代码 = 信息列表 [2]
                建议 = 信息列表 [3]
                评论 = 信息列表 [4]
                原因 = 信息列表 [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()

    如果 __name__ == "__main__":
        队列 = 队列.Queue()
        文件名 = sys.argv[1]
        #定义线程数
        线程 = 20
        f = 打开(文件名,'r')
        g = open(文件名+'.esS','w')
        行 = f.read().splitlines()
        f.close()
        开始 = time.time()
        对于我在范围内(线程):
            t = eSS(队列)
            t.setDaemon(真)
            t.start()
        对于行中的行:
            queue.put(行)     
        queue.join()
        打印 time.time()-开始
        g.close()

4

1 回答 1

4

三个想法浮现在脑海。所有的共同点是在排队等待处理的数据包中包含一个索引。

  • 一种想法是使用控制器/工作人员/输出框架,其中输出线程将工作人员处理的数据出列、组装和输出。
  • 第二个想法是使用内存映射文件进行输出,并使用索引来计算写入文件的偏移量(假设可能是固定长度的写入)。
  • 第三种是使用索引将处理后的数据放入一个新列表中,当列表完成时,将项目写在最后而不是在运行中。
于 2013-04-02T15:45:36.523 回答