2012-12-08 4 views
1

У меня есть каталог с тысячами файлов, и каждый из них должен быть обработан (скриптом python) и впоследствии удален.Несколько процессов чтения и удаления файлов в том же каталоге

Я хотел бы написать сценарий bash, который читает файл в папке, обрабатывает его, удаляет и перемещается в другой файл - порядок не важен. Там будет n запущенных экземпляров этого сценария bash (например, 10), все из которых работают в одном каталоге. Они уходят, когда в каталоге больше нет файлов.

Я думаю, что это создает состояние гонки. Не могли бы вы дать мне совет (или фрагмент кода), как убедиться, что в одном файле не работают два сценария bash?

Или, по-вашему, мне лучше реализовать многопоточность в Python (вместо запуска n разных сценариев bash)?

ответ

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 выхода, если он был в состоянии переместить файл и ненулевой код выхода другого.

1

Единственный верный способ, с помощью которого два сценария не будут действовать в одном файле одновременно, - это использовать какой-то механизм блокировки файлов. Простым способом сделать это может быть переименование файла перед началом работы, добавив некоторую известную строку в имя файла. Затем выполняется работа и файл удаляется. Каждый скрипт проверяет имя файла перед тем, как что-либо делать, и перемещается, если он «особый».

Более сложным подходом было бы поддерживать временный файл, содержащий имена файлов, которые находятся в процессе. Очевидно, что этот файл необходимо удалить, как только все будет завершено.

Смежные вопросы