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

时间:2012-12-08 11:20:39

标签: python bash shell race-condition

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您可以使用在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退出代码以及其他非零退出代码的事实。

答案 2 :(得分:0)

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

producer/consumer problem with python multiprocessing