gpt4 book ai didi

multithreading - ColdFusion 动态线程名称

转载 作者:行者123 更新时间:2023-12-03 12:54:07 25 4
gpt4 key购买 nike

如何在 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> 之外,我找不到其他方法来实例化它们。 ,它不想让我创建一个线程作为结构成员。这是我尝试过的:

尝试 1
<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>

Element ... is undefined in a CFML structure referenced as part of an expression.



在抛出错误之前,这个就达到了输出。我真的没想到线程会在变量范围内,但我无法指定范围,也找不到它内置的范围。简而言之,我不知道如何从那里访问线程:

尝试 2
<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>

Element ... is undefined in a Java object of type class coldfusion.runtime.VariableScope.



非动态示例

作为引用,以下是尝试放入 uuid 之前的代码外观
<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>

最佳答案

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

重要提示:

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

实现:

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

<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 动态线程名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55130086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com