Вам, вероятно, следует использовать модуль Queue
. Из документов:
Модуль Queue реализует многопользовательские, многопользовательские очереди. Это особенно полезно в многопоточном программировании, когда необходимо безопасно обмениваться информацией между несколькими потоками.
Я бы использовал подход FIFO с потоком, отвечающим за проверку входящих файлов и постановку их в очередь, а также за количество рабочих, обрабатывающих их. Модуль LIFO или подход, в котором приоритет назначается с помощью пользовательского метода, также поддерживаются модулем.
РЕДАКТИРОВАТЬ: Если вы не хотите использовать модуль Queue
и у вас система * nix, вы можете вместо этого использовать fcntl.lockf
. Альтернатива, открывая файлы с os.open('filename', os.O_EXLOCK)
.
В зависимости от того, как часто вы выполняете эту операцию, она может оказаться менее эффективной, чем при использовании Queue
, поскольку вам придется учитывать условия гонки (т. Е. Вы можете получить имя файла, который нужно открыть, но файл может быть заблокирован другим потоком, прежде чем вы получите возможность открыть его, создав исключение, которое вам придется перехватить). Queue
есть причина! ;)
EDIT2: Комментарии к этому и другим вопросам поднимают проблему с одновременным доступом к диску различных файлов и, как следствие, снижением производительности. Я думал, что task_done был бы использован для предотвращения этого, но, читая комментарии других, мне пришло в голову, что вместо того, чтобы ставить имена файлов в очередь, можно напрямую ставить их содержимое в очередь. Эта вторая альтернатива будет работать только для ограниченного количества файлов с ограниченным размером в очереди, в противном случае ОЗУ будет заполняться довольно быстро.
Я не знаю, если бы RAID и другие конфигурации параллельных дисков уже позаботились о том, чтобы считывать один файл на диск, а не прыгать туда-сюда между двумя файлами на обоих дисках.
НТН!