用户 A 触发了一个名为“thread1”的 cfthread。此线程需要 30 分钟才能完成,并且是一个“设置并忘记”线程。换句话说,该线程不会与主页面请求一起返回。该线程包含高度占用内存的例程。
用户 B 然后在用户 A 5 分钟后触发同一个命名线程 [cfthread with name 'thread1'],但来自不同的页面请求。
在这种情况下,如何将线程排队,从而减少 CF 应用程序服务器上的处理负载?
请注意,我了解线程队列与具有不同名称的线程。我说的是同一线程的实例。
用户 A 触发了一个名为“thread1”的 cfthread。此线程需要 30 分钟才能完成,并且是一个“设置并忘记”线程。换句话说,该线程不会与主页面请求一起返回。该线程包含高度占用内存的例程。
用户 B 然后在用户 A 5 分钟后触发同一个命名线程 [cfthread with name 'thread1'],但来自不同的页面请求。
在这种情况下,如何将线程排队,从而减少 CF 应用程序服务器上的处理负载?
请注意,我了解线程队列与具有不同名称的线程。我说的是同一线程的实例。
答案是将函数调用锁定在 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>