スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#による並行プログラミング入門 (4) Parallel Loops(3) Break

 今回はBreakの紹介です。 
まずは前回の例で、SoptメソッドをBreakメソッドと入れ替えたものを走らせてみます。 
 
> open System 
open System.Threading 
open System.Threading.Tasks;; 
 
> let longTaskSub r =  
    let res = ref 0  
    for i in 1 .. 100000 do  
      for j in 1 .. 1000 do  
         res := !res + r  
    printfn "引数%3dに対しlongTaskSubの計算が終了" r 
    !res ;; 
 
> Parallel.For(1, 
             100, 
             (fun i (loopState:ParallelLoopState) ->  
                if ( i % 17 = 0) then 
                    printfn "i = %d でBreakメソッドを呼び出します。" i 
                    loopState.Break() 
                else 
                    longTaskSub i |> ignore ) 
             );; 
引数25に対しlongTaskSubの計算が終了 
引数73に対しlongTaskSubの計算が終了 
引数49に対しlongTaskSubの計算が終了 
i = 51 でBreakメソッドを呼び出します。 
引数97に対しlongTaskSubの計算が終了 
引数50に対しlongTaskSubの計算が終了 
引数1に対しlongTaskSubの計算が終了 
引数26に対しlongTaskSubの計算が終了 
引数74に対しlongTaskSubの計算が終了 
引数28に対しlongTaskSubの計算が終了 
引数2に対しlongTaskSubの計算が終了 
引数98に対しlongTaskSubの計算が終了 
引数76に対しlongTaskSubの計算が終了 
引数27に対しlongTaskSubの計算が終了//ここからは、51より大きい値に対して仕事がされていない 
引数29に対しlongTaskSubの計算が終了 
引数3に対しlongTaskSubの計算が終了 
引数31に対しlongTaskSubの計算が終了 
引数30に対しlongTaskSubの計算が終了 
引数4に対しlongTaskSubの計算が終了 
引数5に対しlongTaskSubの計算が終了 
引数7に対しlongTaskSubの計算が終了 
引数32に対しlongTaskSubの計算が終了 
引数9に対しlongTaskSubの計算が終了 
引数35に対しlongTaskSubの計算が終了 
引数10に対しlongTaskSubの計算が終了 
引数33に対しlongTaskSubの計算が終了 
i = 34 でBreakメソッドを呼び出します。 
引数36に対しlongTaskSubの計算が終了 
引数6に対しlongTaskSubの計算が終了//ここからは、34より大きい値に対して仕事がされていない 
引数8に対しlongTaskSubの計算が終了 
i = 17 でBreakメソッドを呼び出します。 
引数11に対しlongTaskSubの計算が終了//ここからは、17より大きい値に対して仕事がされていない 
引数13に対しlongTaskSubの計算が終了 
引数12に対しlongTaskSubの計算が終了 
引数14に対しlongTaskSubの計算が終了 
引数15に対しlongTaskSubの計算が終了 
引数16に対しlongTaskSubの計算が終了 
val it : ParallelLoopResult = 
  System.Threading.Tasks.ParallelLoopResult {IsCompleted = false; 
                                             LowestBreakIteration = 17L;} 
 
割と奇妙な結果ですが、これは「Breakが呼び出された段階で、各スレッドに残っている仕事をやり終えると、Breakが呼び出されたイテレーション値より大きい値については、仕事が呼び出されなくなる」ことによります。 
 
結果のParallelLoopResultにも目をやるとLowestBreakIterationプロパティの値が17Lとなっています。 
すなわち17Lより小さい値については、一通り仕事をしたことが保障されるわけです。 
ちなみにLowestBreakIterationの型はNullable<long>です。 
 
それぞれの仕事が重く、どれかのスレッドでBreakが呼び出されたら、早急に仕事を打ち切る必要がある場合は、ParallelLoopStateオブジェクトのにLowestBreakIterationの値をチェックしながら、仕事をすすめます。この値がnullならBreakが呼び出されていないことが分かります。 
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。