47
ジャパネットQB 2011/02/24 at G*ワークショップ

ジャパネットQB GPars

Embed Size (px)

Citation preview

Page 1: ジャパネットQB GPars

ジャパネットQB

2011/02/24 at G*ワークショップ

Page 2: ジャパネットQB GPars

ジャパネットQB

GParsで並行プログラミング

Page 3: ジャパネットQB GPars

一部元ネタを知らないと楽しめないところがございますが、

ご了承願います m(_ _)m

Page 4: ジャパネットQB GPars

こんばんは、ジャパネットQBの時間だよ。

今日紹介する商品は、GParsだよ、まどか。

Page 5: ジャパネットQB GPars

お前、誰よ

Page 6: ジャパネットQB GPars

名前:キュゥべえ(QB)出身:『魔法少女まどか☆マギカ』(MBS,TBS,CBC)特徴:腹黒口癖:「僕と契約してよ。」

Page 7: ジャパネットQB GPars

ねぇ QB、GParsって何なの?

Page 8: ジャパネットQB GPars

GPars(Groovy Parallel Systems)ってね、Groovyベースの

並行処理ライブラリのことだよ。

Page 9: ジャパネットQB GPars

近年のCPUの進化って、クロックアップよりも

マルチコア・メニーコア化の方が中心だよね。

Page 10: ジャパネットQB GPars

プログラミングもマルチコアを活用すべく、

並行プログラミングが意識されるようになったんだ。

Page 11: ジャパネットQB GPars

まどかは、並行プログラミングって

どうしてる?

Page 12: ジャパネットQB GPars

えっ…java.lang.Threadと

java.lang.Runnableと synchronizedしか…

Page 13: ジャパネットQB GPars

私は、java.util.concurrentパッケージの

ExecutorServiceやFuture、CountDownLatchね。

Page 14: ジャパネットQB GPars

でもね、Java APIだけで並行プログラミングって

なかなか難しいと思わない?

Page 15: ジャパネットQB GPars

そこで、GParsの出番さ。

Page 16: ジャパネットQB GPars

GParsは、様々な言語の並行モデルや調整モデルを

取り込んでいるんだ。

Page 17: ジャパネットQB GPars

・JavaのExecutorやFork/Join・ErlangやScalaのActor・ClojureのAgent・OzのDataflow Variable

Page 18: ジャパネットQB GPars

これらのモデルをGroovyをベースに

使いやすく書きやすいように上手くDSL化してるんだ。

Page 19: ジャパネットQB GPars

GParsのURLはhttp://gpars.codehaus.org/

Page 20: ジャパネットQB GPars

最新バージョンは0.11、昔はGParallelizerって呼ばれてたんだよ。

Page 21: ジャパネットQB GPars

僕と契約してみたく...GParsを使ってみたくなったでしょ?

Page 22: ジャパネットQB GPars

えっ…でも、インストールとか

大変でしょ?

Page 23: ジャパネットQB GPars

そんなことないよ。Groovy 1.8.0-beta-4から

GParsのライブラリがバンドルされるようになったんだ。

Page 24: ジャパネットQB GPars

Groovyをインストールするだけで、GParsも使えるようになるんだ。

Page 25: ジャパネットQB GPars

そんな説明だけでは、ピンと来ないわね。

Page 26: ジャパネットQB GPars

じゃあ、簡単にだけど、GParsの持つ機能を

いくつか紹介するね。

Page 27: ジャパネットQB GPars

まず、並列コレクション。コレクションに対する操作を

並列に行うことができるんだ。

Page 28: ジャパネットQB GPars

並列コレクションimport static groovyx.gpars.GParsPool.withPool

def nums = 1..100000withPool(5) { def squares = nums. collectParallel{ it ** 2 }. grepParallel{ it % 7 == it % 5 }. grepParallel{ it % 3 == 0 } println squares[0..3] + "..." + squares[-3..-1] assert squares[0..3] == [36, 144, 1089, 1296]}

Page 29: ジャパネットQB GPars

さっきの例は、もう少し簡潔に書けるんだ。

Page 30: ジャパネットQB GPars

並列コレクションimport static groovyx.gpars.GParsPool.withPool

def nums = 1..100000withPool(5) { def squares = nums.parallel. map{ it ** 2 }. filter{ it % 7 == it % 5 }. filter{ it % 3 == 0 }. collection println squares[0..3] + "..." + squares[-3..-1] assert squares[0..3] == [36, 144, 1089, 1296]}

Page 31: ジャパネットQB GPars

次は、Fork/Join。分割統治的な処理を

することができるんだ。

Page 32: ジャパネットQB GPars

Fork/Joinimport static groovyx.gpars.GParsPool.withPoolimport static groovyx.gpars.GParsPool.runForkJoin

def quicksort(numbers) { withPool { runForkJoin(0, numbers) {index, list -> def groups = list.groupBy { it <=> list[list.size().intdiv(2)]} if ((list.size() < 2) || (groups.size() == 1)) { return [index: index, list: list.clone()] } (-1..1).each { forkOffChild(it, groups[it] ?: [])} return [index: index, list: childrenResults.sort {it.index}.sum {it.list}] }.list }}

Page 33: ジャパネットQB GPars

次は、Closureの非同期実行。Closureを簡単に

非同期実行するんだ。

Page 34: ジャパネットQB GPars

Closureの非同期実行import static groovyx.gpars.GParsExecutorsPool.withPool

withPool { // 同期 assert 6 == {it * 2}.call(3) // 非同期 assert 6 == {it * 2}.callAsync(3).get()}

Page 35: ジャパネットQB GPars

次は、Actor。メールボックスの

メッセージを使用する軽量のプロセスだね。

Page 36: ジャパネットQB GPars

Actorimport static groovyx.gpars.actor.Actors.actor

def decryptor = actor { react {message -> reply message.reverse() }}def console = actor { react { println 'Decrypted message: ' + it }}

decryptor.send 'lellarap si yvoorG', consoleconsole.join()

Page 37: ジャパネットQB GPars

次は、Agent。オブジェクトに

スレッドセーフにアクセスするための仕組みだよ。

Page 38: ジャパネットQB GPars

Agentimport static groovyx.gpars.agent.Agent

def jugMembers = new Agent<List<String>>(['Me'])

jugMembers.send {it.add 'James'}

final Thread t1 = Thread.start { jugMembers << {it.add 'Joe'}}

final Thread t2 = Thread.start { jugMembers {it.add 'Dave'} jugMembers {it.add 'Alice'}}

[t1, t2]*.join()println jugMembers.valjugMembers.valAsync {println "Current members: $it"}

jugMembers.await()

Page 39: ジャパネットQB GPars

最後は、Dataflow変数。変数へのバインドで

処理を協調的に行うんだ。

Page 40: ジャパネットQB GPars

Dataflow変数import static groovyx.gpars.dataflow.DataFlowVariableimport static groovyx.gpars.dataflow.DataFlow.task

final def x = new DataFlowVariable()final def y = new DataFlowVariable()final def z = new DataFlowVariable()

task { z << x.val + y.val println "Result: ${z.val}"}

task { x << 10}

task { y << 5}

Page 41: ジャパネットQB GPars

ねぇ、どうだった、まどか?並行プログラミングをする時は

GParsを使ってみるといいかも。

Page 42: ジャパネットQB GPars

お約束

Page 43: ジャパネットQB GPars

でも・・・高いんでしょ?

Page 44: ジャパネットQB GPars

Apache 2 ライセンスのオープンソースだよ。

Page 45: ジャパネットQB GPars

だから、僕と契約して、魔法少女になってよ。

Groovy使いになってよ。

Page 46: ジャパネットQB GPars

でも、クーリングオフはできないからね。

Page 47: ジャパネットQB GPars

ジャパネットQB