CFTHREAD执行两次

时间:2015-02-24 21:29:54

标签: multithreading coldfusion cfthread

我有一个调用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行发生错误。

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

2 个答案:

答案 0 :(得分:3)

将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

Ben像往常一样赢得胜利。

答案 1 :(得分:0)

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

此:

<cfset variables = arguments>

将函数的参数复制到对象的共享范围中。如果downloader对象在请求之间共享,则每个请求将使用其他值。

为什么要将参数复制到对象变量范围中?这似乎很奇怪。