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



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

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

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

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

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

然后,你的 bash 脚本遍历文件,尝试重命名它们,如果成功,则调用 python 脚本(我在这里称之为process),否则继续。喜欢这个:

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

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

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

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

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

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

相关内容

  • 没有找到相关文章