在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中使用线程时如何保留文件写入顺序的主要内容,如果未能解决你的问题,请参考以下文章

单线程在python中写入文件

多线程文件写同一个文件写不进去

从列表中的对象中删除字节顺序标记

多线程文件压缩

windows环境,多线程情况下,C语言向文件写入数据。

如何在 PyQt5 中同时读取和写入文件时正确执行多线程?