2012-03-08 4 views
2

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

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

В настоящее время, как я обработка это с cflock вокруг нити:

<cflock name="createAlbumZip" type="exclusive" timeout="30" throwontimeout="no"> 
    <cfthread action="run" albumId="#arguments.albumId#" name="#CreateUUID()#"> 
    .... 

То, что я надеюсь, здесь происходит (это, кажется, работает, если я проверить его) является то, что он будет проверять, если есть в настоящее время поток работает с помощью блокировки, называемой «createAlbumZip». Если есть, то очередь будет запрограммирована в течение 30 секунд, после чего она должна быть отключена без каких-либо ошибок. Если он не смог создать его за 30 секунд, это нормально.

Так что, похоже, это работает, но мой вопрос: это лучший способ справиться с таким сценарием? Запирает ли правильный подход? Есть ли недостатки, которые могут возникнуть в результате такого подхода, который я не вижу?

ответ

2

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

Другое дело, что вам нужно сделать, это скрючившись на IF заявление:

<cfif not (zip file exists)> 
    <cflock ...> 
    <cfif not (zip file exists)> 
     <cfthread> 
     ...create zip... 
     </cfthread> 
    </cfif> 
    </cflock> 
</cfif> 

Это предотвратит случай, когда поток B ожидает, пока поток А создает молнию, а затем поток А заканчивается, и поток B продолжает восстанавливать/перезаписывать его.

Кроме того, вы можете рассмотреть что-то вроде использования JavaScript для предотвращения дополнительных кликов, отключив кнопку/ссылку после ее нажатия.

0

Я думаю, что у вас есть этот код неправильным образом. То, что вы говорите, это «только один поток разрешен для создания нового потока». Теперь это может работать в вашем случае, потому что у вас установлены таймауты, так что никто не может создать другой поток, так что нет возможности запуска сразу двух потоков.

То, что вы хотите сказать, это «только один поток разрешен для создания zip». Поэтому я бы сделал это

<cfthread .... > 
    <cflock> 
    ...zip.... 
+0

Так что если пользователь нажимает ссылку несколько раз (допустим, 100), чтобы генерировать zip, не будет создавать 100 потоков, и если да, то насколько это эффективно? – Cheeky