gpt4 book ai didi

coldfusion - cflock 不会为在同一浏览器中调用的同一 URL 抛出超时

转载 作者:行者123 更新时间:2023-12-02 01:56:59 35 4
gpt4 key购买 nike

我正在尝试在页面 test.cfm 上锁定 block ,下面是在页面上编写的代码。

<cfscript>
writeOutput("Before lock at #now()#");
lock name="threadlock" timeout="3" type="exclusive"
{
writeOutput("<br/>started at #now()#");
thread action="sleep" duration="10000";
writeOutput("<br/>ended at #now()#");
}
writeOutput("<br/>After lock at #now()#");
</cfscript>

假设我的页面 url 是 http://localhost.local/test.cfm并在浏览器的两个不同选项卡中运行它。我原以为其中一个 url 会在 3 秒后抛出超时错误,因为另一个 url 由于线程 sleep 而至少将其锁定 10 秒。令人惊讶的是,我没有收到任何超时错误,而是在第一个调用完成执行后 10 秒后运行第二个页面调用。

但是我附加一些 url 参数(例如 http://localhost.local/test.cfm?q=1 )会抛出错误。此外,我在不同的浏览器中调用相同的 url,然后其中一个调用将引发超时问题。

是基于session和url的锁吗?

更新这是两种不同情况的输出:

案例 1:

TAB1网址:http://localhost.local/test/test.cfm

 Before lock at {ts '2013-10-18 09:21:35'} 
started at {ts '2013-10-18 09:21:35'}
ended at {ts '2013-10-18 09:21:45'}
After lock at {ts '2013-10-18 09:21:45'}

TAB2网址:http://localhost.local/test/test.cfm

Before lock at {ts '2013-10-18 09:21:45'} 
started at {ts '2013-10-18 09:21:45'}
ended at {ts '2013-10-18 09:21:55'}
After lock at {ts '2013-10-18 09:21:55'}

案例 2:

TAB1网址:http://localhost.local/test/test.cfm

 Before lock at {ts '2013-10-18 09:27:18'} 
started at {ts '2013-10-18 09:27:18'}
ended at {ts '2013-10-18 09:27:28'}
After lock at {ts '2013-10-18 09:27:28'}

TAB2网址:http://localhost.local/test/test.cfm ? (在末尾添加 ?)

Before lock at {ts '2013-10-18 09:27:20'} 
A timeout occurred while attempting to lock threadlock.
The error occurred in C:/inetpub/wwwroot/test/test.cfm: line 13
11 :
12 : <cfoutput>Before lock at #now()#</cfoutput>
13 : <cflock name="threadlock" timeout="3" type="exclusive">
14 : <cfoutput><br/>started at #now()#</cfoutput>
15 : <cfthread action="sleep" duration="10000"/>
...

情况 2 的结果符合预期。

对于情况 1,我刚刚注意到的奇怪事情是选项卡 2 输出“在 {ts '2013-10-18 09:21:45'} 锁定之前表明整个请求在 10 秒后开始(意味着在完全执行之后第一个标签)当我在第一个标签 2 秒后在第二个 URL 中触发它时。

最佳答案

我以前在 Chrome 中看到过这种行为。如果一个选项卡正在执行对给定 URL 的请求,则其他选项卡将等待第一个选项卡完成,然后立即返回。

这是一个概念证明,我可以在我的 Chrome 浏览器中一致地复制它。

foo.cfm

<cfoutput>#now()#</cfoutput>
<cfscript>
sleep(5000);
</cfscript>
<cfoutput>#now()#</cfoutput>

在浏览器中打开 foo.cfm 的两个选项卡。

测试 1:尽可能快地执行下一个序列,不要出错。单击 tab1,选择 URL 栏,按回车键。点击tab2,选择地址栏,按回车键。

执行此操作时,您会注意到第一页中的时间戳相隔 5 秒,并且您会注意到第二页上的时间戳甚至在第一页完成后才开始。

测试 2:尽可能快地执行下一个序列,不要出错。单击 tab1,按 ctrl+f5,单击 tab2,按 ctrl+f5。

现在,请注意选项卡二将在选项卡 1 之后几乎立即完成,并且时间戳表明处理时间等于您切换选项卡所花费的时间。

如果您也使用 f5,也会发生相同的行为。所以基本上它是 Chrome 浏览器(可能还有其他浏览器)的微优化,不会对其他选项卡已经在处理的资源发出额外的 http 请求。我尚未测试的假设是,如果资源返回正确的浏览器缓存 HTTP header ,那么第二个请求将使用第一个请求结果。

关于coldfusion - cflock 不会为在同一浏览器中调用的同一 URL 抛出超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19423365/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com