Когда следует использовать cfthread? - PullRequest
3 голосов
/ 12 января 2011

Не могли бы вы привести простой сценарий, где необходима многопоточность? Спасибо, Nich

Ответы [ 4 ]

4 голосов
/ 12 января 2011

Я использовал его в ситуации, когда нам нужно было инициировать некоторую внутреннюю обработку данных для табулирования данных до того, как пользователь выполнит некоторые отчеты.Поэтому после входа в систему мы запускаем задачу, используя cfthread для построения хранилища данных для пользователя.Отлично сработало!

Так что думайте о cfthread как о способе выполнения асинхронной задачи по требованию.Чрезвычайно полезно в правильной ситуации!

3 голосов
/ 12 января 2011

Я использовал cfthread в двух ситуациях.

Как отмечалось выше, я использовал его, когда хотел выполнить асинхронную обработку, пока мой основной поток занимался другими делами. Например, я использовал его для загрузки данных RSS при создании остальной части страницы. Поскольку вызов источника RSS занял пару секунд, я запустил поток перед тем, как приступить к любой другой обработке. Он работал, пока я делал запросы, рисовал макет и т. Д. Затем я присоединился к ветке и отобразил данные RSS. Это избавило меня от необходимости приостанавливать загрузку страницы во время заполнения RSS.

Второй способ, который я использовал, это своего рода альтернатива планировщику по требованию. Мы создавали сложные PDF-документы. Создатель их не нуждался в них немедленно, поэтому вместо того, чтобы пользователь застрял во время создания документа, мы создали несвязанный поток для обработки PDF. Затем мы ограничили количество обрабатываемых cfthread в любой точке p. Теперь, независимо от загрузки, cfthreads будет просто ставиться в очередь и обрабатываться по мере доступности ресурсов.

3 голосов
/ 12 января 2011

Используйте cfthread, если имеет смысл выполнять определенный код параллельно с основным кодом обработки запросов.

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

<cfdirectory directory="x" action="read" name="allFiles" />

<cfloop query="allFiles">
  <cfthread action="run" name="thread-#allFiles.name#>
    <!--- Read your file in and do processing --->
  </cfthread>
</cfloop>

Помните, что есть настройка CF Admin, чтобы установить количество потоков, которые вы можете создать таким образом!Многое также будет зависеть от ваших системных ресурсов.

Существуют и другие примеры, которые описывают другие варианты использования более подробно.Просто сделайте поиск в Google.Я бы порекомендовал праймер Бена Надаля в качестве хорошей отправной точки.

Еще одно предупреждение: темы - это решение всех проблем!Я использовал их для обработки очереди, и столкнулся с проблемой .

В итоге cfthread - отличная особенность ColdFusion, наслаждайтесь!

0 голосов
/ 12 января 2011
<!--- store value into message varaible --->
<cfset variables.message = "It's orginal value.">

<!--- create new thread --->
<cfthread name="ThreadOne">
<!--- overwrite new value into existing variable. --->
<cfset variables.message = "It comes from thread.">
</cfthread>

<!--- join thread --->
<!---
If we leave this join, the code within thread will execute but won't display the value.
--->
<cfthread action="join" name="ThreadOne" />

<!--- Output --->
<cfoutput>#variables.message#</cfoutput>

Проверьте кодировку выше. Это вроде ясно.

...