Проблема параллелизма при работе ввода-вывода - PullRequest
2 голосов
/ 04 ноября 2011

Я пишу многопоточное консольное приложение, которое загружает PDF-файлы из Интернета и локально копирует их на наш сервер контента (сервер Windows). Это также то же место, откуда файлы будут доставляться на наш сайт. Я скептически отношусь к этому подходу из-за проблем параллелизма, например, если пользователь на веб-сайте запрашивает файл pdf с сервера содержимого, и в то же время файл записывается или обновляется консольным приложением, возможно исключение IO. (Приложение также обновляет PDF-файлы, если оригинальное содержимое изменяется со временем) Есть ли способ контролировать проблему параллелизма?

Ответы [ 3 ]

2 голосов
/ 04 ноября 2011

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

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

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

1 голос
/ 04 ноября 2011

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

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

Если веб-сервер не имеет встроенной поддержки для этого, вы можете обслуживать файлы с помощью специального серверного сценария.

0 голосов
/ 04 ноября 2011

Пометить файлы как скрытые до завершения копирования или обновления.

...