1

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

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

我认为这会产生竞争条件。你能给我一个建议(或代码片段)如何确保没有两个 bash 脚本在同一个文件上运行吗?

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

4

3 回答 3

1

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

更复杂的方法是维护一个临时文件,其中包含“正在处理”的文件的名称。一切完成后,显然需要删除该文件。

于 2012-12-08T11:38:32.777 回答
1

您可以使用文件重命名(在同一文件系统上)在 Unix 系统上是原子的这一事实,即文件被重命名或未重命名。为了清楚起见,让我们假设您需要处理的所有文件的名称都以 A 开头(您可以通过为您现在正在处理的文件设置一些单独的文件夹来避免这种情况)。

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

#!/bin/bash

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

此代码段使用的事实是,mv如果它能够移动文件,则返回 0 退出代码,否则返回非零退出代码。

于 2012-12-08T11:51:38.570 回答
0

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

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

于 2012-12-08T12:00:30.620 回答