Nano Hash - криптовалюты, майнинг, программирование

Должен ли я ‹CFLOCK› выполнить ‹CFFILE Action=COPY ›?

Просматривая какой-то старый код, время ожидания которого время от времени истекает, я наткнулся на этот CFLOCK вокруг запуска CFFILE COPY внутри CFLOOP.

Имеет ли это использование CFFLOCK смысл или кажется необходимым? Файл копируется из одного места во вновь созданную папку, которая сама затем заархивируется для будущей загрузки.

Сначала я просто собирался увеличить время ожидания блокировки, но потом начал смотреть на это и думать, не было ли это ошибкой.

<cfloop query="LOCAL.qDocsZip">
<cflock name="copyFileLock" timeout="3600" type="readonly">
<cffile action="copy"
source="#ExpandPath(LOCAL.qDocsZip.file_location)#"     
destination="#LOCAL.zip_new_path#/#LOCAL.qDocsZip.original_file_name#">
</cflock>
</cfloop>

  • Первый вопрос, который я хотел бы задать, это то, что должен делать замок? Базовая блокировка одновременного чтения/записи файлов обычно обрабатывается операционными системами достаточно хорошо, так что же делает код помимо этого, что требует дополнительной блокировки (и достаточно ли детализировано одно имя copyFileLock для этой цели)? Кроме того, я заметил zip в имени файла. Если эта блокировка включает в себя сжатие файлов, может быть лучший подход, например создание временного файла или папки с уникальным именем, которые не требуют блокировки. 16.02.2019
  • ZIP-файл создается для последующей загрузки конечным пользователем. Этот код из блока, который после получения от пользователя списка файлов, существующих на файловом сервере, создает новую папку, копирует файлы из списка в эту папку, а затем архивирует эту папку, сохраняя путь к новому файлу. папку в базу данных. Основная идея cflock заключалась в удаленной возможности того, что один и тот же файл может быть одновременно скопирован двумя разными пользователями в две разные папки. Но мне кажется, что это неправильное понимание того, когда использовать cflock. 28.03.2019
  • Хм... обычно динамические загрузки - это одноразовая вещь, поэтому нет конфликта с другими потоками или необходимости блокировки. Что такого в этом конкретном действии копирования, которое требует блокировки от других потоков? Потому что эта блокировка отдельных потоков копирует ЛЮБОЙ поток, который попадает в этот блок кода, а не только те, которые обращаются к одному и тому же файлу или папке. Кроме того, zip-файл в конечном итоге удаляется после его загрузки? 28.03.2019
  • (Не видел вашего редактирования) Но мне кажется, что это неправильное понимание того, когда использовать cflock Возможно, если только копируемые файлы не являются изменчивыми и могут быть изменены другими потоками одновременно ? Однако, даже если бы это было так, вам не понадобилась бы такая широкая блокировка. Способ написания кода блокирует копирование файла ЛЮБЫМ потоком, а не только текущим копируемым файлом. Вероятно, поэтому у вас иногда бывают перерывы. 28.03.2019

Ответы:


1

Блокировка здесь кажется разумной, но это не то место, и вы не блокируете доступ к файлу исключительно. Вы должны заблокировать всю транзакцию, то есть заблокировать прямо перед получением LOCAL.qDocsZip. Таким образом, вы гарантируете, что копируемые файлы будут затронуты только одним потоком и не столкнутся с параллелизмом с другим потоком. В этой заметке: cflock - это семафор, специфичный для JVM, поэтому он не может гарантировать безопасность транзакций на системном уровне, например. если у вас есть другие программы, которые параллельно обращаются к вашим файлам.

Вот как это должно выглядеть:

<!--- only one thread at a time can execute the code within this lock (exclusive named lock) --->
<cflock name="copyFileLock" timeout="3600" type="exclusive">

    <!--- fetch files to copy in this transaction --->
    <cfquery name="LOCAL.qDocsZip" ...>
        ...
    </cfquery>

    <!--- copy all the files --->
    <cfloop query="LOCAL.qDocsZip">
        <cffile action="copy" ...>
    </cfloop>

</cflock>

(Возможно, вам также следует добавить некоторую обработку ошибок, если это не просто упущено в вашем фрагменте.)

Объяснение

Каждый поток останавливается на cflock и спрашивает семафор copyFileLock, работает ли он в данный момент. Если нет, поток продолжится, извлечет файлы и скопирует их. Пока выполняется все это копирование (работает семафор), все остальные потоки, столкнувшиеся с cflock, будут поставлены в очередь, поэтому приостановите выполнение и дождитесь семафора (в вашем случае каждый поток в очереди будет ждать 3600 секунд, пока семафор не завершится). дать ход, или в противном случае просто забыть об этом и выйти). После завершения операции копирования в первом потоке семафор прекратит работу и проверит очередь. Если другие потоки в это время были поставлены в очередь, следующий поток в очереди возобновит выполнение, очистится и повторится.

Эксклюзивная блокировка гарантирует, что поток никогда не увидит незавершенное состояние файла (= получение файла, который собирается скопировать другим потоком).

16.02.2019
  • Это хорошее объяснение. Однако, не зная больше об общем процессе (и о том, являются ли имена переменных, включающие zip, просто случайными), я все же задаюсь вопросом, необходима ли блокировка и/или уместно ли использование такого широкого имени блокировки. 16.02.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..