【问题标题】:CFTHREAD Executing TwiceCFTHREAD 执行两次
【发布时间】:2015-02-25 08:39:38
【问题描述】:

我有一个调用 cfcomponent 对象的循环。

    <cfset queue_list = "1,2,3">        
    <cfloop list="#queue_list#" index="z">  
                <cfset args = StructNew()>
                <cfset args.group_num = z>          
<cfset args.client_id = 1>          
                <cfset processdownloads = downloader.ProcessDownload(argumentCollection=args)>
            </cfloop>

该组件具有以下功能:

    <cffunction name="ProcessDownload" access="public" output="false">
        <cfargument name="group_num" type="numeric" required="yes">                     
        <cfargument name="client_id" type="numeric" required="yes">                     

        <cfset variables = arguments>

        <cfthread action="RUN" name="download_#variables.client_id#_#variables.group_num#" priority="high">

                    <cffile action="WRITE" file="#expandpath('download\download_in_process\')##variables.group_num#.json" output="#variables.group_num#">           

</cfthread>

</cffunction>

当我运行它时,我收到以下错误:

cfthread 标记的属性验证错误。无法创建名为 DOWNLOAD_4003_3 的线程。线程名称在一个页面中必须是唯一的。
错误发生在第29行。

我不知道为什么,但它似乎运行了两次。它不应该生成具有唯一线程名称的新线程,从而避免线程名称冲突吗?

【问题讨论】:

  • &lt;cfset variables = arguments&gt; 如果不测试代码,看起来 可能 会覆盖系统范围 VARIABLES - 这肯定会导致意外行为。 ..(尽管为什么要重新分配?有什么理由不能只使用arguments 范围来引用变量名?)
  • 另外,如果您没有将 client_id 作为参数传入,您可能会遇到并发用户问题。
  • CFTHREAD 无法访问参数范围,它出现了。还有丹,我传入了 client_id,我只是没有将它包含在代码中。 (例如简化)

标签: multithreading coldfusion cfthread


【解决方案1】:

将 group_num 作为属性传递,这样您就可以在内部访问它,而不会出现变量范围被覆盖的问题。

<cfthread action="RUN" name="download_#arguments.client_id#_#arguments.group_num#" priority="high" group_num="#arguments.group_num#">
    <cffile action="WRITE" file="#expandpath('download\download_in_process\')##attributes.group_num#.json" output="#attributes.group_num#">           
</cfthread>

其他人都是对的,问题是你的变量范围。 发生的事情是每个循环都覆盖了变量范围,因此在创建线程时,它从变量范围中获取线程名称,该变量范围已经设置为 3 ......所以所有三个线程可能会尝试设置为相同名字。

你能用参数命名它吗?如果没有......你可以使用本地。获取名称并将信息传递到 CFThread Creation。

您在组件内部是正确的,您无法访问参数等,这与组件外部的行为非常不同。

Ben Nadel 写了一篇关于这些问题的好文章 http://www.bennadel.com/blog/2215-an-experiment-in-passing-variables-into-a-cfthread-tag-by-reference.htm

像往常一样奔向胜利。

【讨论】:

    【解决方案2】:

    这可能是因为您的 CFC 代码不是线程安全的。

    这个:

    <cfset variables = arguments>
    

    将函数的参数复制到对象的共享范围内。如果downloader 对象在请求之间共享,那么每个请求都将使用另一个请求的值。

    为什么要将参数复制到对象变量范围中?这似乎是一件奇怪的事情。

    【讨论】:

    • 好吧,CFTHREAD 似乎无法访问参数范围,我只是想将传递给该函数的参数传递给 cfthread 本身。
    • 啊。 Gavin 的问题,但是你在线程中需要的任何东西都需要作为&lt;cfthread&gt; 标签的属性传递。
    猜你喜欢
    • 2017-04-27
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 2021-06-01
    相关资源
    最近更新 更多