スポンサーサイト

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

F#による並行プログラミング入門(8) Parallel Loops(5) ParallelOptionsクラス

 Parallel.Forのオーバーロードの一つに次のようなものがあります。 
 
static member For :  
        fromInclusive:int *  
        toExclusive:int *  
        parallelOptions:ParallelOptions *  
        body:Action<int> -> ParallelLoopResult  
 
4つのうち3つはおなじみですが、引数のタプルの第3成分のparallelOptions:ParallelOptionsは、あまりなじみがないと思いますので、今回はこれの説明です。 
parallelOptionsクラスというのは、並行処理の振る舞いを指定するために使うクラスです。 
とりあえず、一つインスタンス化してみます。 
 
> open System 
open System.Threading 
open System.Threading.Tasks;; 
 
> let po = new ParallelOptions();; 
val po : ParallelOptions 
 
プロパティを調べてみます。 
 
> po;; 
val it : ParallelOptions = 
  System.Threading.Tasks.ParallelOptions 
    {CancellationToken = System.Threading.CancellationToken; 
     MaxDegreeOfParallelism = -1; 
     TaskScheduler = System.Threading.Tasks.ThreadPoolTaskScheduler;} 
 
CancellationToken,MaxDegreeOfParallelism,TaskSchedulerと3つのプロパティが表示されました。 
 
まずCancellationTokenですが、 
 
> po.CancellationToken;; 
val it : CancellationToken = 
  System.Threading.CancellationToken 
    {CanBeCanceled = false; 
     IsCancellationRequested = false; 
     WaitHandle = System.Threading.ManualResetEvent;}  
 
といように、キャンセルがらみに使用します。キャンセルについては後日取り上げたいと思ってます。 
 
次のMaxDegreeOfParallelismですが、「並列化の程度の最大」ということで、いくつが並列化の最大かということを指定します。デフォルト値の-1は「おまかせ」ということを表します。 
 
では使ってみます。 
まずいつも通りの時間だけかかる意味のない足し算関数longTaskSubとそれを利用した関数doWorkを定義します。 
 
> let longTaskSub r =  
    let res = ref 0  
    for i in 1 .. 100000 do  
      for j in 1 .. 1000 do  
         res := !res + r  
    !res ;; 
 
val longTaskSub : int -> int 
 
> let doWork i = 
    longTaskSub i |> ignore 
    printfn "引数%dに対しManagedThreadId = %dで仕事を終わらせました"  i Thread.CurrentThread.ManagedThreadId;; 
 
val doWork : int -> unit   
     
ではまずはデフォルト状態で実行してみます。 
 
> #time;; 
--> 現在タイミングはオンです 
 
> Parallel.For(1,100,(fun i -> doWork i)) |> ignore;; 
引数49に対しManagedThreadId = 12で仕事を終わらせました 
引数73に対しManagedThreadId = 13で仕事を終わらせました 
引数25に対しManagedThreadId = 11で仕事を終わらせました 
引数50に対しManagedThreadId = 12で仕事を終わらせました 
引数74に対しManagedThreadId = 13で仕事を終わらせました 
引数97に対しManagedThreadId = 14で仕事を終わらせました 
引数1に対しManagedThreadId = 1で仕事を終わらせました 
引数26に対しManagedThreadId = 11で仕事を終わらせました 
中略 
引数48に対しManagedThreadId = 11で仕事を終わらせました 
リアル: 00:00:08.281、CPU: 00:00:26.437、GC gen0: 0, gen1: 0, gen2: 0 
val it : unit = () 
 
MaxDegreeOfParallelismを2として実行してみます。 
 
> let po2 = new ParallelOptions(MaxDegreeOfParallelism = 2);; 
val po2 : ParallelOptions 
 
> Parallel.For(1,100,po2,(fun i -> doWork i)) |> ignore;; 
引数1に対しManagedThreadId = 1で仕事を終わらせました 
引数50に対しManagedThreadId = 13で仕事を終わらせました 
引数2に対しManagedThreadId = 1で仕事を終わらせました 
引数51に対しManagedThreadId = 12で仕事を終わらせました 
引数3に対しManagedThreadId = 1で仕事を終わらせました 
引数52に対しManagedThreadId = 12で仕事を終わらせました 
引数4に対しManagedThreadId = 1で仕事を終わらせました 
中略 
引数49に対しManagedThreadId = 1で仕事を終わらせました 
引数99に対しManagedThreadId = 13で仕事を終わらせました 
リアル: 00:00:13.163、CPU: 00:00:25.703、GC gen0: 0, gen1: 0, gen2: 0 
val it : unit = () 
 
 
最後にParallelOptionsのプロパティTaskSchedulerですが、これを利用すると自前の「ThreadPoolのキュー」をつくって利用することができるようです。 
詳しくはhttp://msdn.microsoft.com/ja-jp/library/dd997402.aspxを参照してください。
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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