【问题标题】:ColdFusion dynamic thread namesColdFusion 动态线程名称
【发布时间】:2019-03-12 20:23:57
【问题描述】:

如何在 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>

但是,尝试使用线程执行此操作似乎比较棘手,因为除了使用 &lt;cfthread&gt; 之外我找不到实例化它们的方法,它不想让我创建一个线程作为结构成员。这是我尝试过的:

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

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

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

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

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

非动态示例

作为参考,下面是代码在尝试放入 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>

【问题讨论】:

  • 你不能像那样访问线程。您可以在线程完成后加入线程,但不能简单地写入正在运行的线程内的变量,除非它在共享范围内(如应用程序或会话),但即使这样做也最好小心。
  • 我不确定你的意思。在线程内部创建的变量有自己的范围,可以在它们加入后访问。
  • 你的例子是错误的。我不确定你在执行 thread[name].variableName = 1; 时要做什么也许您可以解释一下您要完成的工作。

标签: multithreading coldfusion coldfusion-10


【解决方案1】:

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

重要:

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

实施:

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

<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>

【讨论】:

  • 这并不能真正回答我的问题;你刚刚转储了variables.lckThreadName,但是我怎样才能访问,比如说,创建的第四个线程的值?我不能使用#variables.lckThreadName[4]#。此外,You need to understand that you cannot access the 'thread' scope from outside the thread itself, but you could pass it into a shared scope, like the 'application' or 'session' scope. 并不完全正确,这就是我加入它们的原因,一旦它们加入主线程,它们的作用域就可以访问。
  • 好的。因此,您可以从应用程序变量键中提取名称,也可以将线程名称添加到应用程序值本身。
  • cfthread[key] 是我想要的。我不知道他们可以通过这种方式访问​​。谢谢。我能问一下你在哪里找到的吗?如果它在 Coldfusion 文档中,我已经忽略了它。
  • 好吧。 CFTHREAD 只是一个结构,因此它可以接受来自“集合”循环的键,并且因为两个键都匹配...volia!
  • 其实,Ben Nadel 告诉我 CFTHREAD 是一个结构。有点整洁......
猜你喜欢
  • 2022-05-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多