首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CFTHREAD执行两次

CFTHREAD执行两次
EN

Stack Overflow用户
提问于 2015-02-24 21:29:53
回答 2查看 492关注 0票数 3

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

代码语言:javascript
复制
    <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>

该组件具有以下功能:

代码语言:javascript
复制
    <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>

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

Cf线程标记的属性验证错误。无法创建名为DOWNLOAD_4003_3的线程。线程名称在页面中必须是唯一的。

错误发生在第29行。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-25 00:34:06

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

代码语言:javascript
复制
<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写了一篇关于这些问题的好文章,http://www.bennadel.com/blog/2215-an-experiment-in-passing-variables-into-a-cfthread-tag-by-reference.htm

本和往常一样赢了。

票数 3
EN

Stack Overflow用户

发布于 2015-02-24 23:25:12

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

这是:

代码语言:javascript
复制
<cfset variables = arguments>

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28706694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档