4

100個のスレッド化されたhttp呼び出しを作成しようとしているコードがあります。約40で上限になっているようです。

threadJoinを実行すると、ループが1〜100であるにもかかわらず、http呼び出しから38〜40セットの結果しか得られません。

// 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);
}

CFが作成できるスレッドの数に制限はありますか?バックグラウンドで実行されているJavaと関係がありますか?それとも、それほど多くのhttpリクエストを処理できないのでしょうか。

スレッド化されたHTTP呼び出しよりも、これを行うためのはるかに優れた方法はありますか?

4

3 に答える 3

7

表示されている結果は、変数がスレッドセーフではないためである可能性があります。

grabber.addParam(type="url",name="page",value="#page#");

Variables.Pageその行は、生成されたすべてのスレッドによって共有されるアクセスです。スレッドは異なる時間に開始するため、の値pageは多くの場合、思っている値とは異なります。これにより、の値が同じである複数のスレッドが発生しますpage

代わりに、page属性としてスレッドに渡すと、各スレッドには独自のバージョンの変数があり、100個の一意の値になります。(1-100)。

さらに、共有変数にも書き込んでいます。

arrayAppend(VARIABLES.arrResults,results.fileContent);

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;
}

そして参加:

// rejoin threads
for (page="2";page <= pages; page++) {
    threadJoin('req#page#',10000);
    arrayAppend(VARIABLES.arrResults, CFThread['req#page#'].Result);
}
于 2012-09-17T14:54:35.940 に答える
3

ColdFusion管理者には、同時に実行する数の設定があります。私のデフォルトは10です。残りは明らかにキューに入れられています。Phantom42には、実行中のCFスレッドの数を増やすことができると記載されていますが、100以上のスレッドを使用すると、他の問題が発生する可能性があります。

32ビットプロセスでは、プロセス全体で2ギガのメモリしか使用できません。各スレッドは、ヒープの一部ではないスタックメモリを消費します。Java Binary + Heap + Non-Heap(PermGen)+(threads * 512k)は2ギガの制限を簡単に超えてしまう可能性があるため、スレッド数が多いとメモリが不足するという問題が発生しました。

また、上記のコードを処理するのに十分なスレッドを許可する必要があります。また、アプリに着信する他のリクエストも許可する必要があります。これにより、アプリ全体が機能しなくなる可能性があります。

コードを変更して、それぞれが複数のリクエストを実行するN個のスレッドを作成することをお勧めします。それはもっと手間がかかりますが、Nリクエスト=Nスレッドの問題を解決します。あなたが取ることができるいくつかのアプローチがあります:

  • 各リクエストにほぼ同じ時間がかかると思われる場合は、作業を分割して、各スレッドを開始する前に、各スレッドに作業する部分を与えることができます。

  • または、各スレッドがリストからURLを選択して処理すると、N個のスレッドすべてに参加できます。ただし、進行状況を追跡するために使用したカウンターの周りにロックを設定する必要があります。

于 2012-09-17T13:47:33.990 に答える
0

Maximum number of running JRun threads[ColdFusionAdministrator]の[RequestTuning]タブで設定を確認してください。デフォルトは50です。

于 2012-09-17T13:31:05.047 に答える