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

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

最佳答案

将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创建中。

您对组件内部是正确的,不能访问参数等,这与组件外部的行为大不相同。

本·纳德尔(Ben Nadel)就这些问题写了一篇不错的文章
http://www.bennadel.com/blog/2215-an-experiment-in-passing-variables-into-a-cfthread-tag-by-reference.htm

Ben像往常一样赢得胜利。

关于multithreading - CFTHREAD执行两次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28706694/

10-10 15:04