CFTHREAD 执行两次
CFTHREAD Executing Twice
我有一个调用 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 行。
我不知道为什么,但似乎 运行ning 两次。它不应该生成一个具有唯一线程名称的新线程,从而避免线程名称冲突吗?
这可能是因为您的 CFC 代码不是线程安全的。
这个:
<cfset variables = arguments>
将函数的参数复制到对象的共享范围中。如果 downloader
对象在请求之间共享,那么每个请求都将使用另一个请求的值。
为什么要将参数复制到对象变量范围?这似乎是一件奇怪的事情。
将 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 写了一篇关于这些问题的文章 post
http://www.bennadel.com/blog/2215-an-experiment-in-passing-variables-into-a-cfthread-tag-by-reference.htm
Ben 像往常一样赢得胜利。
我有一个调用 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 行。
我不知道为什么,但似乎 运行ning 两次。它不应该生成一个具有唯一线程名称的新线程,从而避免线程名称冲突吗?
这可能是因为您的 CFC 代码不是线程安全的。
这个:
<cfset variables = arguments>
将函数的参数复制到对象的共享范围中。如果 downloader
对象在请求之间共享,那么每个请求都将使用另一个请求的值。
为什么要将参数复制到对象变量范围?这似乎是一件奇怪的事情。
将 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 写了一篇关于这些问题的文章 post http://www.bennadel.com/blog/2215-an-experiment-in-passing-variables-into-a-cfthread-tag-by-reference.htm
Ben 像往常一样赢得胜利。