Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
Groovyで並行処理with
@Naoki Rin
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
自己紹介
Twitter:@Naoki RinHatena :id:naokirin
物理学専攻の大学院生。Groovy歴は 1ヶ月ちょっと。そもそも Javaもあんまり知らないという圧倒的に知識不足な Groovy使い。
自分が学びたいがために今回、佐賀 Groovy勉強会を開催しました。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
目次
.
. .1 GParsとは
.
. .
2 データ並列処理
.
. .
3 アクター
.
. .
4 エージェント
.
. .
5 データフロー
.
. .
6 まとめ
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
GPars?
GParsとは…
並行処理ライブラリGroovyベースでDSLによる記述Groovy1.8から本体にバンドルされている様々な言語から並行処理のモデルを取り入れている
Groovyで気軽に本格的な並列処理ができるライブラリ!
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
GPars?
GParsとは…並行処理ライブラリGroovyベースでDSLによる記述Groovy1.8から本体にバンドルされている様々な言語から並行処理のモデルを取り入れている
Groovyで気軽に本格的な並列処理ができるライブラリ!
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
GPars?
GParsとは…並行処理ライブラリGroovyベースでDSLによる記述Groovy1.8から本体にバンドルされている様々な言語から並行処理のモデルを取り入れている
Groovyで
気軽に本格的な並列処理ができるライブラリ!
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
GPars?
GParsとは…並行処理ライブラリGroovyベースでDSLによる記述Groovy1.8から本体にバンドルされている様々な言語から並行処理のモデルを取り入れている
Groovyで気軽に
本格的な並列処理ができるライブラリ!
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
GPars?
GParsとは…並行処理ライブラリGroovyベースでDSLによる記述Groovy1.8から本体にバンドルされている様々な言語から並行処理のモデルを取り入れている
Groovyで気軽に本格的な並列処理ができるライブラリ!
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
GParsを使うには…
Groovy 1.8以降なら GPars 0.11が本体にバンドルされているので Groovyをインストールしたらインポートするだけで使える!
ただし、最新の Groovy 1.8.2でも GPars 0.12はバンドルされていないので、GPars 0.12を使いたいときはは別途自分で入れる必要あり。
やり方としては Groovy本体に入っている gpars-0.11.jarをgpars-0.12.jarに置き換えればOK!
Groovy 1.8以前の人は@GrabでもOK!
ちなみに今回は、GPars 0.12について話します。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
GPars、6つの世界
GParsの世界
データ並列処理
アクターモデル
エージェント
データフロー
Stm
Groovy CSP
今日はこのうち、
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
GPars、6つの世界
GParsの世界
データ並列処理
アクターモデル
エージェント
データフロー
Stm
Groovy CSP
今日はこのうち、
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
GPars、6つの世界
GParsの世界
データ並列処理
アクターモデル
エージェント
データフロー
Stm
Groovy CSP
今日はこのうち、
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
GPars、6つの世界
GParsの世界
データ並列処理
アクターモデル
エージェント
データフロー
Stm
Groovy CSP
今日はこのうち、上の 4つについて話します。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
データ並列処理(Data Parallelism)
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
データ並列処理(Data Parallelism)
並列コレクション
..
Go!
コレクションに対する処理を並列に行う。非同期な関数 (クロージャ)の実行
..
Go!
非同期に関数を実行する。
Map/Reduce
..
Go!
Map/Reduceにより処理を行う。
Fork/Join
..
Go!
Fork/Joinの操作をすることができる。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
並列コレクション
並列コレクションとは…
Groovyのコレクションに対する処理を並列に行うことができる機能。イテレーティブなメソッドの並列処理を簡単に行える。
並列コレクションで使うクラスGParsPool -JSR-166y(ParallelArray)を基にした DSLで並行なコレクションの処理を可能にするGParsExecutorsPool -Java Executorを基にした並行なコレクションの処理を可能にする
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
並列コレクションを使う
.
並列コレクション
.
.
.
. ..
.
.
import groovyx.gpars.GParsPool
GParsPool.withPool {assert ([2, 3, 4, 5]==[1, 2, 3, 4].collectParallel {it + 1})
}
withPoolで囲った部分で並列処理を行う。collectParallel()メソッドで並列に collectしている。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
xxxParallelメソッドwithPool内では xxxParallel()というメソッドがコレクションに対して並列処理をするメソッドとして使うことができる。
withPool内でしか使えないことと並列処理で行われること以外は xxxの部分と名前が同じメソッドと同じ動作をする。
.
findAll()も findAllParallel()も結果は同じ
.
.
.
. ..
.
.
import groovyx.gpars.GParsPool
GParsPool.withPool {assert ([1, 2, 3, 4 ].findAll{it % 2 == 0}== [1, 2, 3, 4 ].findAllParallel{it % 2 == 0})
}
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
xxxParallelの種類
下記のメソッドが GParsPool.withPool内でコレクションに対して並列処理を行うメソッドとして使える。
anyParallel()
collectParallel()
countParallel()
eachParallel()
eachWithIndexParallel()
everyParallel()
findAllParallel()
findAnyParallel()
findParallel()
foldParallel()
grepParallel()
groupByParallel()
maxParallel()
minParallel()
splitParallel()
sumParallel()
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
スレッド数を指定する
.
withPoolでスレッド数を指定する
.
.
.
. ..
.
.
import groovyx.gpars.GParsPool
GParsPool.withPool(10) {// 並列処理
}
withPoolでは引数で並列処理するスレッド数を指定することができる。指定しない場合はコア数+1。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
小ネタ
.
withPoolを使わずに並列処理
.
.
.
. ..
.
.
import groovyx.gpars.ParallelEnhancer
def list = [4, 1, 5, 3, 2 ]ParallelEnhancer.enhanceInstance(list)
assert (list.findParallel {it == 3} == 3)
.
Parallelをつけずに並列処理
.
.
.
. ..
.
.
import groovyx.gpars.GParsPool
GParsPool.withPool{def data = (1..3).makeConcurrent()assert( data.collect {it ** 2} == [1, 4, 9] )
}
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
非同期な関数(クロージャ)の実行
.
非同期にクロージャ実行
.
.
.
. ..
.
.
GParsPool.withPool() {Future result = {it * 2}.callAsync(3)assert 6 == result.get()
}
withPool内で callAsync()メソッドでクロージャを非同期に実行できる。ただし、返ってくるのは Future型なので、値は get()で取り出す。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
Map/Reduce
Map/Reduceとは分割統治法やバックトラックのようなアルゴリズムフレームワークの一種。それを GParsではメソッドチェーンにより簡単に実現できる。
map処理入力データを何らかの値に関連付け、キー/バリューのペアにする。reduce処理map処理で得られたデータをもとにリダクション (複数のデータから一つの値を導出)する。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
GParsのMap/Reduce
GParsでは、Map/Reduceは Parallel Arrayを直接操作する形になっている。
そのため、操作するときには Parallel Arrayに直す必要があり、前ページのサンプルで最初に parallelを呼び出していたのはそのため。
また、メソッドによっては Parallel Arrayを返さないので、さらに処理を続ける際には getParallel()メソッドで ParallelArrayにする必要がある。
逆に Parallel ArrayからMapなどに変換する場合はcollectionを呼ぶとよい。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
Map/Reduceで使えるメソッド
メソッド 戻り値map() Parallel Array(AbstractPAWrapper)reduce() Tfilter() Parallel Array(AbstractPAWrapper)size() intsum() Tmin() Tmax() Tsort() Parallel Array(AbstractPAWrapper)groupBy() Mapcombine() Map
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
Map/Reduceを使う
.
文字ごとの文字数をMapで返す
.
.
.
. ..
. .
GParsPool.withPool {println (”Hello World”.parallel.map{[it, 1]}.combine(0) { sum, value -> sum + value}.getParallel().sort{-it.value}.collection)
}
.
結果
.
.
.
. ..
.
.
[l=3, o=2, H=1, e=1, W=1, =1, d=1, r=1]
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
Fork/Join
forkスレッドを起動する。この起動された複数のスレッドが並行タスクを実行する。
joinforkされたスレッドを待ち合わせる。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
Fork/Joinのやり方
使うメソッド
forkOffChild() -スレッドを生成して、このメソッドを実行したクロージャを実行runChildDirectly() -現在のスレッドでこのメソッドを実行したクロージャを実行GPars 0.12からgetChildrenResults() -forkしたスレッドからの結果を返すrunForkJoin() -withPool内で Fork/Joinを実行
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
Fork/Joinを使う
.
fibonacci数を求める
.
.
.
. ..
. .
import groovyx.gpars.GParsPool
Closure fib = {number ->if (number <= 2) {return 1
}forkOffChild(number - 1)final def result = runChildDirectly(number - 2)return (Integer) getChildrenResults().sum() + result
}GParsPool.withPool {assert 55 == GParsPool.runForkJoin(10, fib)
}
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
アクターモデル
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
アクターモデルとは
アクターモデルとは計算実体としてアクターというものが存在し、アクターは並行的に
他のアクターに有限個のメッセージを送信する。
有限個の新たなアクターを生成する。
メッセージを受信し、受信したメッセージに応じて動作を行う。
という振る舞いをするものである。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
GParsでのアクター
.
受信したメッセージを表示するアクター
.
.
.
. ..
.
.
import static groovyx.gpars.actor.Actors.*
def console = actor { // アクターloop {react {msg ->println msg
}}
}
console.send ’Hello World!’ // 送信!
.
結果
.
.
.
. ..
.
.Hello World
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
アクター
.
メッセージを 1度だけ受信して表示するアクター
.
.
.
. ..
.
.
import static groovyx.gpars.actor.Actors.*
def console = actor {react {msg ->println msg
}}
reactで受信したメッセージに対しての処理を行う。受信したメッセージは reactのクロージャに渡される。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
メッセージ送信
.
メッセージ送信
.
.
.
. ..
.
.
console.send ’Hello World!’ // 全て同じconsole ’Hello World!’ // 全て同じconsole << ’Hello World!’ // 全て同じconsole.call ’Hello World!’ // 全て同じ
メッセージの送信の方法は複数あり、上記全てでメッセージ送信が可能。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
複数回のメッセージ受信
.
複数回のメッセージを受信できるアクター
.
.
.
. ..
. .
import static groovyx.gpars.actor.Actors.*
def console = actor {loop{react {msg ->println msg
}}
}
loopを使うことで反復ができるので、その中に reactを書くことで複数回メッセージを受信できる。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
reactor
.
reactorを使ってみる
.
.
.
. ..
.
.
import static groovyx.gpars.actor.Actors.*
def console = reactor { // 受信メッセージの処理 }
actor{loop{react{ }}}は使用頻度が高いので、reactor{}で書けるようになっている。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
メインスレッドで待機する
.
メインスレッドで待機する
.
.
.
. ..
.
.
console.send ’Hello!’console.send ’Hello!!’console.stop()
console.join()
join()を用いると、アクターの処理が終わるまで、メインスレッドを待機させることができる。待機させなければ、アクターの処理と並行してメインスレッドの処理が進む。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
送信元へメッセージを送信
.
送信と返信
.
.
.
. ..
.
.
def console = reactor {reply it.reverse()}assert ’Hello!’ == console.sendAndWait(’ !olleH’)
replyで送信元にメッセージを返信することができる。sendAndWait()はメッセージを送信後、メッセージが返信されるまで待機する。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
送信元の情報を得る
.
オウム返し
.
.
.
. ..
. .
def parrot = reactor {println ’Parrot: ’ + itsender.send it
}
def mary = actor {println ’Mary: Hello!’parrot.send ’Hello!’react{println ’Mary: Good!’}
}
senderにより、送信元の情報を得ることができる。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
エージェント
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
エージェントとは
エージェントとはスレッド間で共有されるミュータブルなデータ (状態)をラッピングして、スレッドセーフに扱えるようにするもの。要はデータをエージェントが守ってくれる。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
GParsのエージェント
.
エージェントを使ってみる
.
.
.
. ..
.
.
import groovyx.gpars.GParsPoolimport groovyx.gpars.agent.Agent
def agent = new Agent(1)GParsPool.withPool {(1..10).eachParallel {value ->agent {updateValue(it * value)}
}}println agent.val
.
結果
.
.
.
. ..
.
.3628800
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
Agentの生成
.
Agentのインスタンスを生成
.
.
.
. ..
. .
import groovyx.gpars.agent.Agent
def intAgent = new Agent(0)def stringAgent = new Agent<String>()
assert 0 == intAgent.val
Agentのコンストラクタに値を渡せばその値によって初期化される。Groovyの場合、コンストラクタに渡す初期値で値の型を決定してくれるが、明示的に指定することも可能。結果の値は.valで取り出すことができる。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
値の更新
.
値の更新
.
.
.
. ..
.
.
import groovyx.gpars.agent.Agent
def jvmLangList = new Agent<List<String>>()jvmLangList {updateValue([’Java’])}jvmLangList.send {it << ’Scala’}jvmLangList.call {it.add ’Clojure’}jvmLangList jvmLangList.val + ’Groovy’assert [’Java’, ’Scala’, ’Clojure’, ’Groovy’]
== jvmLangList.val
値の更新はエージェントに送るクロージャ内で行う。updateValue()で内包しているオブジェクトを置き変えることができる。エージェントに送るものがクロージャでない場合、それを新しい値とする。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
非同期な値の取得
.
非同期な値の取得
.
.
.
. ..
.
.
def members = new Agent([’Jones’])final Thread t1 = Thread.start {members {it.add ’Bob’}members {it.add ’Davis’}
}final Thread t2 = Thread.start {members {it.add ’Alice’}members {it.remove(0)}
}//たとえば [Jones, Bob, Davis, Alice]と表示されるmembers.valAsync {println it}
.valでは全ての送信された処理が全て終わるまで待機してから値を返す。valAsync()では待機しないで valAsync()が呼び出された時の値をクロージャに渡す。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
データフロー
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
データフロー(変数)とはデータフロー変数とはそれ自身が束縛されるまで処理を待機させるような変数のこと。そのため、命令型プログラミングとは異なり、実行順序は逐次的でない。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
GParsのDataflow
.
データフローを使ってみる
.
.
.
. ..
.
.
import groovyx.gpars.dataflow.Dataflowimport groovyx.gpars.dataflow.DataflowVariable
final def x = new DataflowVariable()final def y = new DataflowVariable()final def z = new DataflowVariable()
Dataflow.task { z << x.val + y.val }Dataflow.task { x << 5 }Dataflow.task { y << 10 }
println z.val
.
結果
.
.
.
. ..
.
.15
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
DataflowVariable
.
DataflowVariable
.
.
.
. ..
.
.
import static groovyx.gpars.dataflow.Dataflow.taskimport groovyx.gpars.dataflow.DataflowVariable
final def x = new DataflowVariable()final def y = new DataflowVariable()
task{y << x.val + 1}task{x << 1}
assert 2 == y.val
DataflowVariableは単一割り当てのデータフロー変数のクラス。Dataflow.taskで独立した処理を書くことができる。task間の順序の依存関係は自動的に解決してくれる。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
デッドロックに注意!
.
デッドロック!
.
.
.
. ..
. .
import static groovyx.gpars.dataflow.Dataflow.taskimport groovyx.gpars.dataflow.DataflowVariable
def x = new DataflowVariable()def y = new DataflowVariable()
task {x << y.val}task {y << x.val}
println x.val // デッドロック!
タスク同士の順序関係が付けられないような記述をすると、デッドロックが起こってしまうので注意。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
Dataflows
.
Dataflows
.
.
.
. ..
.
.
import static groovyx.gpars.dataflow.Dataflow.taskimport groovyx.gpars.dataflow.Dataflows
final def dfs = new Dataflows()task {dfs[0] = dfs.x + ” ” + dfs.y}task {dfs.y = ”Groovy!”}task {dfs.x = ”Hello”}
assert ”Hello Groovy!” == dfs[0]
Dataflowsは DataflowVariableをより便利に使えるようにしたデータフロー変数のクラス。プロパティやインデックスでアクセスできるようになっている。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
DataflowQueue
.
DatafowQueue
.
.
.
. ..
. .
import groovyx.gpars.dataflow.DataflowQueue
final def queue = new DataflowQueue()queue << ’a’queue << ’b’queue << ’c’
assert ’a’ == queue.valassert ’b’ == queue.val
assert ’c’ == queue.val
DataflowQueueはキューとして扱えるデータフロー変数。キューに値が入っていたら.valで取り出すことができる。
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
まとめ
GParsはGroovyの機能を生かした便利な機能がたくさんつまったすごい並行処理ライブラリ!
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
最後に
参考資料
プログラミング Groovy
..
http://gihyo.jp/book/2011/978-4-7741-4727-7
GPars Users Guide
..
http://gpars.org/0.12/guide/index.html
GPars Javadoc
..
http://gpars.org/0.12/javadoc
Groovy で並行処理with GPars!
@Naoki Rin
目次
GPars とはGPars を使うには…
GPars、6 つの世界
データ並列処理並列コレクション
非同期な関数の実行
Map/Reduce
Fork/Join
アクターメッセージ受信
メッセージ送信
複数回のメッセージ受信
メインスレッドで待機
送信元へメッセージ送信
送信元の情報
エージェントAgent の生成
値の更新
非同期な値の取得
データフローDataflowVariable
Dataflows
DataflowQueue
まとめ
. . . . . .
ご清聴ありがとうございました