Coldfusion限制为总线程数

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调用之外,还有一个更好的方法吗?

nos*_*leg 6

您看到的结果可能是因为您的变量不是线程安全的.

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)