1

用户 A 触发了一个名为“thread1”的 cfthread。此线程需要 30 分钟才能完成,并且是一个“设置并忘记”线程。换句话说,该线程不会与主页面请求一起返回。该线程包含高度占用内存的例程。

用户 B 然后在用户 A 5 分钟后触发同一个命名线程 [cfthread with name 'thread1'],但来自不同的页面请求。

在这种情况下,如何将线程排队,从而减少 CF 应用程序服务器上的处理负载?

请注意,我了解线程队列与具有不同名称的线程。我说的是同一线程的实例。

4

1 回答 1

1

答案是将函数调用锁定在 cfthread 标记内。这是一个例子:

<cfthread action="run" name="thread1">
  <cflock name="threadlock" type="exclusive" timeout="10000">
    <cfset callToSomeFunction()>
  </cflock>
</cfthread>

因此,要对此进行测试,请将下面的代码复制到 .cfm 模板中。打开 Firefox,然后打开 Chrome。然后在 Firefox 中测试模板。等待 5 秒,然后在 Chrome 中测试模板:

<cfthread action="run" name="thread1">
  <cfset tickstart = GetTickCount()>
  <cfset time = StructNew()>
  <cfset time.timestart = DateFormat(now(),'dd-mm-yy') & " " & TimeFormat(now(),'hh-mm-ss')>
  <cflock name="threadlock" type="exclusive" timeout="10000">
    <cfthread action="sleep" duration="#(10 * 1000)#" />
  </cflock>
  <cfset tickend = GetTickCount()> 
  <cfset tick = tickend - tickstart> 
  <cfset time.tick = tick/1000>
  <cfset time.timeend = DateFormat(now(),'dd-mm-yy') & " " & TimeFormat(now(),'hh-mm-ss')>
  <cfdump var="#time#" format="html" metainfo="no" output="somefilepath\#thread1.name#-#DateFormat(now(),'dd-mm-yy')#-#TimeFormat(now(),'hh-mm-ss')#.htm" />
</cfthread>
于 2015-11-01T21:03:46.887 回答