关于python:多个进程读取和删除同一目录中的文件

Multiple processes reading&deleting files in the same directory

我有一个包含数千个文件的目录,每个文件都必须(通过一个python脚本)处理,然后删除。

我想写一个bash脚本,它读取文件夹中的一个文件,处理它,删除它,并移动到另一个文件中——顺序并不重要。这个bash脚本将有n个正在运行的实例(例如10个),所有实例都在同一个目录下运行。当目录中没有其他文件时,它们会退出。

我认为这创造了一个种族条件。你能给我一个建议(或代码片段)如何确保没有两个bash脚本在同一个文件上运行吗?

或者您认为我应该在Python中实现多线程(而不是运行不同的bash脚本)?


您可以使用这样一个事实:文件重命名(在同一个文件系统上)在UNIX系统上是原子的,即文件是否被重命名。为了清晰起见,让我们假设您需要处理的所有文件都以a开头(您可以通过为正在处理的文件设置单独的文件夹来避免这一点)。

然后,您的bash脚本迭代这些文件,尝试重命名它们,如果成功则调用python脚本(我在这里称它为process),否则继续。这样地:

1
2
3
4
5
6
7
8
9
#!/bin/bash

for file in A*; do
    pfile=processing.$file
    if mv"$file""$pfile"; then
       process"$pfile"
       rm"$pfile"
    fi
done

此代码段使用这样一个事实:如果mv能够移动文件,则返回0退出代码,否则返回非零退出代码。


没有两个脚本同时作用于同一个文件的唯一可靠方法是使用某种文件锁定机制。一个简单的方法是在开始工作之前重命名文件,方法是在文件名后面附加一些已知的字符串。然后完成工作并删除文件。每个脚本在执行任何操作之前测试文件名,如果文件名是"特殊的",则继续执行。

更复杂的方法是维护一个临时文件,其中包含"正在处理"的文件名。很明显,一旦完成所有操作,就需要删除此文件。


我认为解决你问题的办法是消费者-生产者模式。我认为这个解决方案是正确的开始方法:

python多处理的生产者/消费者问题