在python中使用线程时如何保留文件写入顺序
Posted
技术标签:
【中文标题】在python中使用线程时如何保留文件写入顺序【英文标题】:How to preserve file write order when using threading in python 【发布时间】:2013-03-23 21:00:26 【问题描述】:我有一些 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()【问题讨论】:
'有些人在遇到问题时会想,“我知道,我会使用线程”,然后两个他们就有问题了。 (内德·巴彻尔德) 大声笑很好的重新利用的报价:) 不使用队列怎么样?您可以让每个线程处理原始列表的特定索引,然后将结果放入同一索引处的新列表中。 重新加入线程,然后从主线程写入...或查看信号量和互斥体 您的代码甚至不会按原样运行。变量g
不在 run 方法的范围内。另外,正如丹尼尔所暗示的,你真的需要线程吗?即使忽略乱序信息,这实际上是否比顺序读取和写入更快?
【参考方案1】:
我想到了三个想法。所有人的共同点是在排队等待处理的数据包中包含一个索引。
然后一种想法是使用控制器/工作人员/输出框架,其中输出线程将工作人员处理的数据出列、组装和输出。 第二个想法是使用内存映射文件进行输出,并使用索引计算写入文件的偏移量(假设可能是固定长度写入)。 第三个是使用索引将处理后的数据放入一个新列表中,当列表完成时,将项目写在最后而不是在运行中。【讨论】:
拿了你的第三个子弹,加了一个计数器,然后写在最后。谢谢。以上是关于在python中使用线程时如何保留文件写入顺序的主要内容,如果未能解决你的问题,请参考以下文章