我的项目需要多个线程从同一个文件夹读取文件。 这个文件夹有传入文件,文件只能由这些线程中的任何一个处理。 之后,这个文件读取线程,处理它之后删除文件。
第一个答案后编辑:我不想要一个单独的线程负责读取文件名并将这些名称提供给其他线程,以便他们可以读取它。
有什么有效的方式来实现这个python?
如何做多个模式replacesed
使用Ptrace来跟踪正在打开的文件的位置
如何判断sqlite是否在Linux上正确安装?
如何获得方向键,并在Linux键盘上input键来performance得像Windows7
LD_PRELOAD哪个程序是目标
Windows vs Linux – math结果差异
使用stat来检测文件是否存在(慢?)
如何正确启动一个将使用Go守护进程的进程?
/ tmp与/ dev / shm在Linux上的临时文件存储?
curl – SPNEGO无法find谈判机制
你应该使用Queue模块 。 从文档:
队列模块实现了多生产者,多用户队列。 当在多线程之间必须安全地交换信息时,它在线程编程中特别有用。
我将使用FIFO方法,负责检查入站文件并对其进行排队,还有一些工作人员正在处理它们。 LIFO方法或使用自定义方法分配优先级的方法也被模块支持。
编辑:如果你不想使用Queue模块,你是在* nix系统下,你可以使用fcntl.lockf来代替。 另一种方法是用os.open('filename',os.O_EXLOCK)打开文件。
根据您执行此操作的频率,您可能会发现它比使用Queue性能要差,因为您必须考虑竞争条件(即:您可能获取要打开的文件的名称,但该文件可能被另一个线程在你有机会打开它,抛出一个异常,你将不得不陷入)。 Queue是有原因的! ;)
编辑2:在这个问题和其他问题的意见是提出了同时磁盘访问不同的文件和随之而来的性能问题的问题。 我在想task_done会被用来防止这种情况发生,但是读到别人的意见,我发现不是排队文件名,而是直接排队文件的内容。 这第二种方法只适用于数量有限的大小排队文件,因为RAM会相当快地填满。
我不知道如果RAID和其他并行磁盘配置已经照顾每个磁盘读取一个文件,而不是在两个磁盘上的两个文件之间来回跳动。
HTH!
如果你想让多个线程直接从同一个文件夹中并行读取几个文件,那么我必须让你失望。 并行读取单个磁盘不是一个可行的选择。 单个磁盘需要旋转并寻找下一个要读取的位置。 如果你正在阅读多个线程,你只是在寻求之间反弹磁盘,性能比简单的顺序读取更糟糕。
只要坚持mac的建议,并使用一个单一的线程阅读。