スポンサーサイト

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

F#による並行プログラミング入門(13) Parallel Tasks(2) Parallel.Invoke

 前回は「newとstartとwait」もしくは「Task.Factory.StartNewとwait」でタスクを生成開始して、終了を待ちましたが、今回はそれをもっと手軽にできるParallel.Invokeを紹介します。 
 
まずはシグネチャーから。 
 
static member Invoke :  
        actions:Action[] -> unit  
 
では例です。 
 
> open System 
open System.Threading 
open System.Threading.Tasks;; 
 
> let longTaskSubL r =  
    let res = ref 0L  
    for i in 1L .. 10000L do  
      for j in 1L .. 1000L do  
         res := !res + r  
    printfn "引数%Aに対しlongTaskSubの計算が終了" r 
    !res  
 
let doWorkL i = 
    longTaskSubL i |> ignore 
    printfn "引数%Aに対しManagedThreadId = %dで仕事を終わらせました"  i Thread.CurrentThread.ManagedThreadId 
;; 
 
val longTaskSubL : int64 -> int64 
val doWorkL : int64 -> unit 
 
ここでParallel.Invokeを使ってみますが、次のように書くと型推論がきかずにエラーが出てしまします。 
 
Parallel.Invoke [|(fun () -> doWorkL 3L);(fun () -> doWorkL 1L);(fun () -> doWorkL 2L)|] 
 
そこで、ワンクッションおいてAction型にキャストします。 
 
> [|(fun () -> doWorkL 3L);(fun () -> doWorkL 1L);(fun () -> doWorkL 2L)|] 
|> Array.map (fun f -> Action(f)) 
|> Parallel.Invoke 
;; 
引数引数引数3Lに対しlongTaskSubの計算が終了 
1Lに対しlongTaskSubの計算が終了 
2Lに対しlongTaskSubの計算が終了 
引数引数引数1Lに対しManagedThreadId = 5で仕事を終わらせました 
3Lに対しManagedThreadId = 6で仕事を終わらせました 
2Lに対しManagedThreadId = 4で仕事を終わらせました 
val it : unit = () 
 
上は次のようにも書き直せます。 
 
[|3L;1L;2L|] 
|> Array.map (fun i -> Action(fun () -> doWorkL i)) 
|> Parallel.Invoke 
 
なおParallel.InvokeにはParallel.Forなどと同様にParallelOptionsを引数の一部にするオーバーロードも準備されています。 
 
public static void Invoke( 
    ParallelOptions parallelOptions, 
    params Action[] actions 
 
利用法はParallel.Forなどと同様なので割愛します。 
 
留意点は、これを使うと「すべての仕事の処理終了を待つという」という点です。 
 
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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