Pet*_*ete 3 coldfusion multithreading cfhttp
我有一些代码试图创建100个线程http调用.它似乎被限制在40左右.
当我做threadJoin时,我只能从我的http调用获得38到40组结果,尽管循环是从1到100.
// thread http calls
pages = 100;
for (page="1";page <= pages; page++) {
thread name="req#page#" {
grabber.setURL('http://site.com/search.htm');
// request headers
grabber.addParam(type="url",name="page",value="#page#");
results = grabber.send().getPrefix();
arrayAppend(VARIABLES.arrResults,results.fileContent);
}
}
// rejoin threads
for (page="2";page <= pages; page++) {
threadJoin('req#page#',10000);
}
Run Code Online (Sandbox Code Playgroud)
CF可以创建的线程数有限制吗?是否与在后台运行的Java有关?或者它可以不处理那么多的http请求?
除了线程HTTP调用之外,还有一个更好的方法吗?
您看到的结果可能是因为您的变量不是线程安全的.
grabber.addParam(type="url",name="page",value="#page#");
Run Code Online (Sandbox Code Playgroud)
该行正在访问Variables.Page,由所有生成的线程共享.由于线程在不同的时间开始,因此值page通常与您认为的值不同.这将导致多个线程具有相同的值page.
相反,如果您page作为属性传递给线程,那么每个线程将拥有自己的变量版本,最终将得到100个唯一值.(1-100).
此外,您还要写一个共享变量.
arrayAppend(VARIABLES.arrResults,results.fileContent);
Run Code Online (Sandbox Code Playgroud)
ArrayAppend不是线程安全的,你将覆盖VARIABLES.arrResults其他版本的版本,而不是附加每个位.
您希望将结果设置为thread变量,然后在连接完成后访问该变量.
thread name="req#page#" page=Variables.page {
grabber.setURL('http://site.com/search.htm');
// request headers
grabber.addParam(type="url",name="page",value="#Attributes.page#");
results = grabber.send().getPrefix();
thread.Result = results.fileContent;
}
Run Code Online (Sandbox Code Playgroud)
加入:
// rejoin threads
for (page="2";page <= pages; page++) {
threadJoin('req#page#',10000);
arrayAppend(VARIABLES.arrResults, CFThread['req#page#'].Result);
}
Run Code Online (Sandbox Code Playgroud)