ColdFusion动态线程名称

问题描述 投票:2回答:1

如何在ColdFusion中访问动态线程名称?通常,如果我使用动态变量名称,我会做这样的事情:

<cfloop from="1" to="10" index="counter" > 
    <cfset Names[counter] = rereplace( createUUID(), "[-_\.]", "", "all") />
    <cfset something[ Names[counter] ] = 1 />
</cfloop>

<cfoutput>
    #( something[ Names[1] ] + something[ Names[2] ] + something[ Names[3] ]  )#
</cfoutput>

但是,尝试使用线程执行此操作似乎更棘手,因为除了使用<cfthread>之外我无法找到实例化它们的方法,<cfloop from="1" to="10" index="counter" > <cfset ThreadNames[counter] = rereplace( createUUID(), "[-_\.]", "", "all") /> <cfthread action="run" name="#something[ ThreadNames[counter] ]#" > <cfset Thread.something = 1 /> </cfthread> </cfloop> 不希望允许我创建线程作为结构成员。这是我尝试过的:

尝试1

<cfloop from="1" to="10" index="counter" > 
    <cfset ThreadNames[counter] = rereplace( createUUID(), "[-_\.]", "", "all") />
    <cfthread action="run" name="#ThreadNames[counter]#" > 
        <cfset Thread.something = 1 />
    </cfthread>
</cfloop>

<cfthread action="join" name="#ThreadNames[1]#, #ThreadNames[2]#, #ThreadNames[3]#" />

<cfoutput>
    #( VARIABLES[ThreadNames[1]].something  + VARIABLES[ThreadNames[2]].something  + VARIABLES[ThreadNames[3]].something  )#
</cfoutput>

元素...在作为表达式的一部分引用的CFML结构中未定义。

在抛出错误之前,这个到达输出。我真的不希望线程在变量范围内,但我不能指定范围,我也找不到它内置的范围。简而言之,我无法弄清楚如何从那里访问线程:

尝试2

<cfloop from="1" to="10" index="counter" > 
    <cfthread action="run" name="thread#counter#" > 
        <cfset Thread.something = 1 />
    </cfthread>
</cfloop>

<cfthread action="join" name="thread1, thread2, thread3" />

<cfoutput>
    #( thread1.something  + thread2.something  + thread3.something  )#
</cfoutput>

Element ...在类coldfusion.runtime.VariableScope类型的Java对象中未定义。

非动态示例

作为参考,这里是代码在尝试抛出uuids之前的样子

<cfset variables.threadNames = {} />

<cfloop from="1" to="10" index="counter" > 
  <cfset variables.threadName = REReplace(CreateUUID(), "[-]", "", "all") />
  <cfthread action="run" name="#variables.threadName#" threadName="#variables.threadName#" counter="#counter#"> 
    <cfset thread.something = attributes.counter />
    <cfset variables.threadNames[attributes.threadName] = thread.something />
  </cfthread>
</cfloop>

<cfthread action="join" name="#StructKeyList(variables.threadNames)#" timeout="6000" />

<cfloop collection="#variables.threadNames#" item="key">
  <cfset variables.thread = cfthread[key]>
  <cfdump var="#variables.thread#" />
</cfloop>
multithreading coldfusion coldfusion-10
1个回答
3
投票

我已经更新了这个答案,以简化我的例子。以前,我已将线程名称存储在应用程序变量键中。除非您希望全局存储值,否则这是不必要的。 “变量”范围已经足够了。

重要:

当您使用“运行”操作时,它是一个“设置并忘记”操作。除非线程已连接,否则无法从外部访问创建的任何线程范围变量。另一种方法是在共享范围内创建变量,例如“应用程序”或“会话”范围。可以从外部访问对线程内的共享范围变量所做的任何更改。

执行:

使用“属性”范围通过传入线程名称来访问线程名称。通过在线程中存储线程名称,可以确保线程已经执行并且在线程连接时将存在。

qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.