我的项目需要多个线程从同一个文件夹中读取文件。此文件夹包含传入文件,该文件只能由其中任何一个线程处理。稍后,这个文件读取线程,在处理完文件后删除它。
第一个回答后编辑:我不想让一个线程负责读取文件名并将这些名称提供给其他线程,以便他们可以阅读。
在python中有没有有效的方法来实现这个目标?
答案 0 :(得分:2)
您应该使用Queue
module。来自文档:
Queue模块实现多生产者,多消费者队列。当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用。
我会使用FIFO方法,一个负责检查入站文件并排队的线程,以及一些处理它们的工作人员。模块也支持LIFO方法或使用自定义方法分配优先级的方法。
编辑:如果您不想使用Queue
模块并且您位于* nix系统下,则可以使用fcntl.lockf
。另一种方法是使用os.open('filename', os.O_EXLOCK)
打开文件。
根据您执行此操作的频率,您可能会发现它的性能低于使用Queue
,因为您必须考虑竞争条件(即:您可能会获取要打开的文件的名称,但是在你有机会打开它之前,该文件可能会被另一个线程锁定,抛出一个你将不得不陷入的异常。 Queue
是有原因的! ;)
EDIT2:此问题和其他问题中的评论引发了对不同文件的同时磁盘访问以及随之而来的性能影响的问题。我原以为task_done会被用来阻止这种情况,但是读到别人的评论后,我发现不是排队文件名,而是直接排队文件的内容。第二种替代方案仅适用于有限数量的有限大小的排队文件,因为RAM会很快填满。
我不知道RAID和其他并行磁盘配置是否已经为每个磁盘读取一个文件而不是在两个磁盘上的两个文件之间来回弹跳。
HTH!
答案 1 :(得分:1)
如果你想让多个线程直接从同一个文件夹中读取多个文件,那么我必须让你失望。从单个磁盘并行读取不是一个可行的选择。单个磁盘需要旋转并寻找下一个要读取的位置。如果您正在使用多个线程进行读取,那么您只是在搜索之间弹出磁盘,性能比简单的顺序读取要糟糕得多。
坚持使用mac的建议并使用单个线程进行阅读。