2

アプリケーション ID のリストをループ処理するルーチンが ColdFusion にあります。そのリスト内で、PDF ドキュメントの生成やマージなど、多くのことが行われます。これは非常に遅くなるので、cfthread でできることを調べてみました。結果は有望です。40 秒の実行時間が 4 秒に短縮されます。

ただし、cfthread は、その性質上、ループが何を行っているかを認識していません。これがコードサンプルです。

<cfloop list="#form.User_Id#" index="x">
    <cfthread name="thread#x#" action="run" index="#x#">
          <cfdocument format="PDF" name="report" filename="#fileToDownload#" overwrite="yes">
          <cfdocumentsection>
          <cfquery name="example" datasource="DS">
             SELECT * FROM Table
             WHERE ID = #x#
          </cfquery>

          <cfoutput query="example">
               All the output
          </cfoutput>
          </cfdocumentsection>
    </cfthread>
</cfloop>

<cfthread action="join" />

最終的に何が起こるかというと、すべてのループ反復がリストの最後の値を繰り返すということです。では、これを機能させるには、一体何をする必要があるのでしょうか?

ありがとう!

4

1 に答える 1

1

アダムが言ったように、おそらくもう少し必要です。

ここで探している「最終結果」がある場合、「最終的な PDF」はループ/スレッド コードによって実行される作業に依存します。上記のコードは、一貫性のない予測不可能な結果を​​もたらします。

また、上記のコードは、リストの長さに基づいて任意の数のスレッドを作成する可能性があることに注意してください。あなたが指摘したように、これらのスレッドを「起動して忘れる」ように作成し、それらに同時に処理を行わせます。あなたがする必要があるのは、A)必要なスレッドまたはシステムが処理できるスレッドの数を把握し、B)スレッドを適切に終了または結合するようにループを工夫することです。そうすれば、それらは THIS リクエストの一部であり、メインのリクエストが完了した後に任意の作業を行うだけではありません。

Ray (Camden) は彼のブログで、10 回ループしてからすべてを結合する良い例を公開しています。コードが頻繁に、または同時に実行される場合 (スレッド要求の制限を超過する可能性があります)、これは実行できない可能性がありますが、スケジュールされたタスクには適切なアプローチである可能性があります。Rayの記事へのリンクです。

http://www.raymondcamden.com/2009/05/18/CFTHREAD-いつ参加するか

スレッドの選択を予測可能にする作業の控えめな「チャンク」で考えることができます。たとえば、ループで最大 5 つのスレッドを作成し、5 回目の反復でそれらを結合すると、6 回目の反復で次のグループ化が開始されます...意味がわかりますか?

于 2015-12-04T14:53:05.247 に答える