Чтение нескольких потоков из одной папки в Linux - PullRequest
0 голосов
/ 09 декабря 2011

Для моих проектов требуется несколько потоков, читающих файлы из одной и той же папки.В эту папку входят входящие файлы, и файл должен обрабатываться только одним из этих потоков.Позже, этот поток чтения файла удаляет файл после его обработки.

РЕДАКТИРОВАТЬ после первого ответа: Я не хочу ни одного потока, отвечающего за чтение имен файлов и передачу этих имен вдругие потоки, чтобы они могли читать его.

Есть ли какой-нибудь эффективный способ добиться этого в python?

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Вам, вероятно, следует использовать модуль Queue . Из документов:

Модуль Queue реализует многопользовательские, многопользовательские очереди. Это особенно полезно в многопоточном программировании, когда необходимо безопасно обмениваться информацией между несколькими потоками.

Я бы использовал подход FIFO с потоком, отвечающим за проверку входящих файлов и постановку их в очередь, а также за количество рабочих, обрабатывающих их. Модуль LIFO или подход, в котором приоритет назначается с помощью пользовательского метода, также поддерживаются модулем.


РЕДАКТИРОВАТЬ: Если вы не хотите использовать модуль Queue и у вас система * nix, вы можете вместо этого использовать fcntl.lockf. Альтернатива, открывая файлы с os.open('filename', os.O_EXLOCK).

В зависимости от того, как часто вы выполняете эту операцию, она может оказаться менее эффективной, чем при использовании Queue, поскольку вам придется учитывать условия гонки (т. Е. Вы можете получить имя файла, который нужно открыть, но файл может быть заблокирован другим потоком, прежде чем вы получите возможность открыть его, создав исключение, которое вам придется перехватить). Queue есть причина! ;)


EDIT2: Комментарии к этому и другим вопросам поднимают проблему с одновременным доступом к диску различных файлов и, как следствие, снижением производительности. Я думал, что task_done был бы использован для предотвращения этого, но, читая комментарии других, мне пришло в голову, что вместо того, чтобы ставить имена файлов в очередь, можно напрямую ставить их содержимое в очередь. Эта вторая альтернатива будет работать только для ограниченного количества файлов с ограниченным размером в очереди, в противном случае ОЗУ будет заполняться довольно быстро.

Я не знаю, если бы RAID и другие конфигурации параллельных дисков уже позаботились о том, чтобы считывать один файл на диск, а не прыгать туда-сюда между двумя файлами на обоих дисках.

НТН!

1 голос
/ 09 декабря 2011

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

Просто следуйте советам Mac и используйте одну ветку для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...