检查冷熔线
Check on coldfusion threads
我正在尝试执行以下操作,它没有引发错误,但我也不知道它是否在做任何事情。有没有办法检查 Coldfusion 中的线程状态?
<cfset start = CreateDate(2005, 1, 1) />
<cfset stop = DateAdd("m", 1, now() ) />
<cfloop condition="start LTE stop">
<cfthread name="#dateformat(start, 'mmddyyyy')#" action="run">
<cfinvoke component="CFCs.DoSomething" method="DoSomething"
returnvariable="success"
dateStartDate="#dateformat(start, 'mm/dd/yyyy')#"
dateEndDate="#dateformat(DateAdd('m', 1, start), 'mm/dd/yyyy')#"
/>
</cfthread>
<cfoutput> #LSDateFormat(start)# <br/> </cfoutput>
<cfset start = DateAdd("m", 1, start)>
</cfloop>
首先,您的线程中的 start
变量可能会更改,因为它没有被传入。您在线程范围内需要的任何东西都应该在属性中传递。这使得变量线程安全。否则,如果变量在线程外发生变化,它也会在线程内发生变化,并可能产生意想不到的结果。在线程内部,如果要在线程外部访问变量,可以将变量存储在 THREAD
范围内。您还可以将您的代码放在 try/catch 中,并将异常存储在 THREAD
范围内,这样您就可以在线程外读取它以确定它是否出错以及为什么出错。
保留线程名称列表,然后在循环后使用 <cfthread action="join">
。这告诉 CF 等待所有线程完成。然后您可以通过 CFTHREAD
范围访问线程。 CFTHREAD
结构将使用线程名称的键存储您的线程,因此您可以循环遍历它。
<cfset start = CreateDate(2005, 1, 1) />
<cfset stop = DateAdd("m", 1, now() ) />
<cfset threadNames = ''>
<cfloop condition="start LTE stop">
<cfset newThreadName = dateformat(start, 'mmddyyyy') >
<!--- add thread name to list of threads --->
<cfset threadNames = listAppend(threadNames, newThreadName ) >
<cfthread name="#newThreadName#" action="run" start="#start#">
<cftry>
<!--- store a variable in THREAD scope to be used outside thread --->
<cfset THREAD.start = ATTRIBUTES.start>
<cfset THREAD.foo = "bar">
<!--- Do stuff here --->
<cfcatch type="any">
<!--- catch any error and store in the thread result --->
<cfset THREAD.exception = CFCATCH>
</cfcatch>
</cftry>
</cfthread>
<cfoutput> #LSDateFormat(start)# <br/> </cfoutput>
<cfset start = DateAdd("m", 1, start)>
</cfloop>
<!--- this waits for all threads to complete --->
<cfthread action="join" name="#threadNames#" />
<!--- loop over thread results --->
<cfloop collection="#CFTHREAD#" item="t">
<!--- do whatever you want with the thread result struct --->
<cfoutput>#CFTHREAD[t].STATUS# <br /></cfoutput>
</cfloop>
<!--- Dump all the threads --->
<cfdump var="#CFTHREAD#" abort="true" />
我正在尝试执行以下操作,它没有引发错误,但我也不知道它是否在做任何事情。有没有办法检查 Coldfusion 中的线程状态?
<cfset start = CreateDate(2005, 1, 1) />
<cfset stop = DateAdd("m", 1, now() ) />
<cfloop condition="start LTE stop">
<cfthread name="#dateformat(start, 'mmddyyyy')#" action="run">
<cfinvoke component="CFCs.DoSomething" method="DoSomething"
returnvariable="success"
dateStartDate="#dateformat(start, 'mm/dd/yyyy')#"
dateEndDate="#dateformat(DateAdd('m', 1, start), 'mm/dd/yyyy')#"
/>
</cfthread>
<cfoutput> #LSDateFormat(start)# <br/> </cfoutput>
<cfset start = DateAdd("m", 1, start)>
</cfloop>
首先,您的线程中的 start
变量可能会更改,因为它没有被传入。您在线程范围内需要的任何东西都应该在属性中传递。这使得变量线程安全。否则,如果变量在线程外发生变化,它也会在线程内发生变化,并可能产生意想不到的结果。在线程内部,如果要在线程外部访问变量,可以将变量存储在 THREAD
范围内。您还可以将您的代码放在 try/catch 中,并将异常存储在 THREAD
范围内,这样您就可以在线程外读取它以确定它是否出错以及为什么出错。
保留线程名称列表,然后在循环后使用 <cfthread action="join">
。这告诉 CF 等待所有线程完成。然后您可以通过 CFTHREAD
范围访问线程。 CFTHREAD
结构将使用线程名称的键存储您的线程,因此您可以循环遍历它。
<cfset start = CreateDate(2005, 1, 1) />
<cfset stop = DateAdd("m", 1, now() ) />
<cfset threadNames = ''>
<cfloop condition="start LTE stop">
<cfset newThreadName = dateformat(start, 'mmddyyyy') >
<!--- add thread name to list of threads --->
<cfset threadNames = listAppend(threadNames, newThreadName ) >
<cfthread name="#newThreadName#" action="run" start="#start#">
<cftry>
<!--- store a variable in THREAD scope to be used outside thread --->
<cfset THREAD.start = ATTRIBUTES.start>
<cfset THREAD.foo = "bar">
<!--- Do stuff here --->
<cfcatch type="any">
<!--- catch any error and store in the thread result --->
<cfset THREAD.exception = CFCATCH>
</cfcatch>
</cftry>
</cfthread>
<cfoutput> #LSDateFormat(start)# <br/> </cfoutput>
<cfset start = DateAdd("m", 1, start)>
</cfloop>
<!--- this waits for all threads to complete --->
<cfthread action="join" name="#threadNames#" />
<!--- loop over thread results --->
<cfloop collection="#CFTHREAD#" item="t">
<!--- do whatever you want with the thread result struct --->
<cfoutput>#CFTHREAD[t].STATUS# <br /></cfoutput>
</cfloop>
<!--- Dump all the threads --->
<cfdump var="#CFTHREAD#" abort="true" />