GPars in Saga Groovy Study

55
Groovy で並行処理 with GPars@Naoki Rin 目次 GPars とは GPars を使うには… GPars6 つの世界 データ並列処理 並列コレクション 非同期な関数の実行 Map/Reduce Fork/Join アクター メッセージ受信 メッセージ送信 複数回のメッセージ受信 メインスレッドで待機 送信元へメッセージ送信 送信元の情報 エージェント Agent の生成 値の更新 非同期な値の取得 データフロー DataflowVariable Dataflows DataflowQueue まとめ Groovy で並行処理 with @Naoki Rin

description

佐賀Groovy勉強会のGParsの資料です。

Transcript of GPars in Saga Groovy Study

Page 1: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

Groovyで並行処理with

@Naoki Rin

Page 2: GPars in Saga Groovy Study

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勉強会を開催しました。

Page 3: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

目次

.

. .1 GParsとは

.

. .

2 データ並列処理

.

. .

3 アクター

.

. .

4 エージェント

.

. .

5 データフロー

.

. .

6 まとめ

Page 4: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

GPars?

GParsとは…

並行処理ライブラリGroovyベースでDSLによる記述Groovy1.8から本体にバンドルされている様々な言語から並行処理のモデルを取り入れている

Groovyで気軽に本格的な並列処理ができるライブラリ!

Page 5: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

GPars?

GParsとは…並行処理ライブラリGroovyベースでDSLによる記述Groovy1.8から本体にバンドルされている様々な言語から並行処理のモデルを取り入れている

Groovyで気軽に本格的な並列処理ができるライブラリ!

Page 6: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

GPars?

GParsとは…並行処理ライブラリGroovyベースでDSLによる記述Groovy1.8から本体にバンドルされている様々な言語から並行処理のモデルを取り入れている

Groovyで

気軽に本格的な並列処理ができるライブラリ!

Page 7: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

GPars?

GParsとは…並行処理ライブラリGroovyベースでDSLによる記述Groovy1.8から本体にバンドルされている様々な言語から並行処理のモデルを取り入れている

Groovyで気軽に

本格的な並列処理ができるライブラリ!

Page 8: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

GPars?

GParsとは…並行処理ライブラリGroovyベースでDSLによる記述Groovy1.8から本体にバンドルされている様々な言語から並行処理のモデルを取り入れている

Groovyで気軽に本格的な並列処理ができるライブラリ!

Page 9: GPars in Saga Groovy Study

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について話します。

Page 10: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

GPars、6つの世界

GParsの世界

データ並列処理

アクターモデル

エージェント

データフロー

Stm

Groovy CSP

今日はこのうち、

Page 11: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

GPars、6つの世界

GParsの世界

データ並列処理

アクターモデル

エージェント

データフロー

Stm

Groovy CSP

今日はこのうち、

Page 12: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

GPars、6つの世界

GParsの世界

データ並列処理

アクターモデル

エージェント

データフロー

Stm

Groovy CSP

今日はこのうち、

Page 13: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

GPars、6つの世界

GParsの世界

データ並列処理

アクターモデル

エージェント

データフロー

Stm

Groovy CSP

今日はこのうち、上の 4つについて話します。

Page 14: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

データ並列処理(Data Parallelism)

Page 15: GPars in Saga Groovy Study

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の操作をすることができる。

Page 16: GPars in Saga Groovy Study

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を基にした並行なコレクションの処理を可能にする

Page 17: GPars in Saga Groovy Study

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している。

Page 18: GPars in Saga Groovy Study

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})

}

Page 19: GPars in Saga Groovy Study

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()

Page 20: GPars in Saga Groovy Study

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。

Page 21: GPars in Saga Groovy Study

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] )

}

Page 22: GPars in Saga Groovy Study

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()で取り出す。

Page 23: GPars in Saga Groovy Study

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処理で得られたデータをもとにリダクション (複数のデータから一つの値を導出)する。

Page 24: GPars in Saga Groovy Study

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を呼ぶとよい。

Page 25: GPars in Saga Groovy Study

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

Page 26: GPars in Saga Groovy Study

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]

Page 27: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

Fork/Join

forkスレッドを起動する。この起動された複数のスレッドが並行タスクを実行する。

joinforkされたスレッドを待ち合わせる。

Page 28: GPars in Saga Groovy Study

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を実行

Page 29: GPars in Saga Groovy Study

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)

}

Page 30: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

アクターモデル

Page 31: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

アクターモデルとは

アクターモデルとは計算実体としてアクターというものが存在し、アクターは並行的に

他のアクターに有限個のメッセージを送信する。

有限個の新たなアクターを生成する。

メッセージを受信し、受信したメッセージに応じて動作を行う。

という振る舞いをするものである。

Page 32: GPars in Saga Groovy Study

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

Page 33: GPars in Saga Groovy Study

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のクロージャに渡される。

Page 34: GPars in Saga Groovy Study

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!’ // 全て同じ

メッセージの送信の方法は複数あり、上記全てでメッセージ送信が可能。

Page 35: GPars in Saga Groovy Study

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を書くことで複数回メッセージを受信できる。

Page 36: GPars in Saga Groovy Study

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{}で書けるようになっている。

Page 37: GPars in Saga Groovy Study

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()を用いると、アクターの処理が終わるまで、メインスレッドを待機させることができる。待機させなければ、アクターの処理と並行してメインスレッドの処理が進む。

Page 38: GPars in Saga Groovy Study

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()はメッセージを送信後、メッセージが返信されるまで待機する。

Page 39: GPars in Saga Groovy Study

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により、送信元の情報を得ることができる。

Page 40: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

エージェント

Page 41: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

エージェントとは

エージェントとはスレッド間で共有されるミュータブルなデータ (状態)をラッピングして、スレッドセーフに扱えるようにするもの。要はデータをエージェントが守ってくれる。

Page 42: GPars in Saga Groovy Study

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

Page 43: GPars in Saga Groovy Study

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で取り出すことができる。

Page 44: GPars in Saga Groovy Study

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()で内包しているオブジェクトを置き変えることができる。エージェントに送るものがクロージャでない場合、それを新しい値とする。

Page 45: GPars in Saga Groovy Study

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()が呼び出された時の値をクロージャに渡す。

Page 46: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

データフロー

Page 47: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

データフロー(変数)とはデータフロー変数とはそれ自身が束縛されるまで処理を待機させるような変数のこと。そのため、命令型プログラミングとは異なり、実行順序は逐次的でない。

Page 48: GPars in Saga Groovy Study

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

Page 49: GPars in Saga Groovy Study

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間の順序の依存関係は自動的に解決してくれる。

Page 50: GPars in Saga Groovy Study

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 // デッドロック!

タスク同士の順序関係が付けられないような記述をすると、デッドロックが起こってしまうので注意。

Page 51: GPars in Saga Groovy Study

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をより便利に使えるようにしたデータフロー変数のクラス。プロパティやインデックスでアクセスできるようになっている。

Page 52: GPars in Saga Groovy Study

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で取り出すことができる。

Page 53: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

まとめ

GParsはGroovyの機能を生かした便利な機能がたくさんつまったすごい並行処理ライブラリ!

Page 54: GPars in Saga Groovy Study

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

Page 55: GPars in Saga Groovy Study

Groovy で並行処理with GPars!

@Naoki Rin

目次

GPars とはGPars を使うには…

GPars、6 つの世界

データ並列処理並列コレクション

非同期な関数の実行

Map/Reduce

Fork/Join

アクターメッセージ受信

メッセージ送信

複数回のメッセージ受信

メインスレッドで待機

送信元へメッセージ送信

送信元の情報

エージェントAgent の生成

値の更新

非同期な値の取得

データフローDataflowVariable

Dataflows

DataflowQueue

まとめ

. . . . . .

ご清聴ありがとうございました