ジャパネットQB GPars

3,898 views
3,818 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,898
On SlideShare
0
From Embeds
0
Number of Embeds
20
Actions
Shares
0
Downloads
9
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

ジャパネットQB GPars

  1. 1. ジャパネットQB2011/02/24 at G*ワークショップ
  2. 2. ジャパネットQB GParsで 並行プログラミング
  3. 3. 一部元ネタを知らないと楽しめないところがございますが、 ご了承願います m(_ _)m
  4. 4. こんばんは、ジャパネットQBの時間だよ。 今日紹介する商品は、 GParsだよ、まどか。
  5. 5. お前、誰よ
  6. 6. 名前:キュゥべえ(QB)出身:『魔法少女まどか☆マギカ』(MBS,TBS,CBC)特徴:腹黒口癖:「僕と契約してよ。」
  7. 7. ねぇ QB、GParsって何なの?
  8. 8. GPars(Groovy Parallel Systems) ってね、Groovyベースの並行処理ライブラリのことだよ。
  9. 9. 近年のCPUの進化って、 クロックアップよりもマルチコア・メニーコア化の方が 中心だよね。
  10. 10. プログラミングも マルチコアを活用すべく、 並行プログラミングが意識されるようになったんだ。
  11. 11. まどかは、並行プログラミングって どうしてる?
  12. 12. えっ… java.lang.Threadとjava.lang.Runnableと synchronizedしか…
  13. 13. 私は、java.util.concurrentパッケージの ExecutorServiceやFuture、 CountDownLatchね。
  14. 14. でもね、Java APIだけで 並行プログラミングってなかなか難しいと思わない?
  15. 15. そこで、GParsの出番さ。
  16. 16. GParsは、様々な言語の並行モデルや調整モデルを 取り込んでいるんだ。
  17. 17. ・JavaのExecutorやFork/Join・ErlangやScalaのActor・ClojureのAgent・OzのDataflow Variable
  18. 18. これらのモデルを Groovyをベースに使いやすく書きやすいように上手くDSL化してるんだ。
  19. 19. GParsのURLはhttp://gpars.codehaus.org/
  20. 20. 最新バージョンは0.11、 昔はGParallelizerって 呼ばれてたんだよ。
  21. 21. 僕と契約してみたく...GParsを使ってみたくなったでしょ?
  22. 22. えっ…でも、インストールとか 大変でしょ?
  23. 23. そんなことないよ。 Groovy 1.8.0-beta-4からGParsのライブラリがバンドル されるようになったんだ。
  24. 24. Groovyをインストールするだけで、 GParsも使えるようになるんだ。
  25. 25. そんな説明だけでは、 ピンと来ないわね。
  26. 26. じゃあ、簡単にだけど、 GParsの持つ機能を いくつか紹介するね。
  27. 27. まず、並列コレクション。 コレクションに対する操作を並列に行うことができるんだ。
  28. 28. 並列コレクションimport static groovyx.gpars.GParsPool.withPooldef 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]}
  29. 29. さっきの例は、もう少し簡潔に書けるんだ。
  30. 30. 並列コレクションimport static groovyx.gpars.GParsPool.withPooldef 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]}
  31. 31. 次は、Fork/Join。 分割統治的な処理をすることができるんだ。
  32. 32. Fork/Joinimport static groovyx.gpars.GParsPool.withPoolimport static groovyx.gpars.GParsPool.runForkJoindef 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 }}
  33. 33. 次は、Closureの非同期実行。 Closureを簡単に 非同期実行するんだ。
  34. 34. Closureの非同期実行import static groovyx.gpars.GParsExecutorsPool.withPoolwithPool { // 同期 assert 6 == {it * 2}.call(3) // 非同期 assert 6 == {it * 2}.callAsync(3).get()}
  35. 35. 次は、Actor。 メールボックスのメッセージを使用する軽量のプロセスだね。
  36. 36. Actorimport static groovyx.gpars.actor.Actors.actordef decryptor = actor { react {message -> reply message.reverse() }}def console = actor { react { println Decrypted message: + it }}decryptor.send lellarap si yvoorG, consoleconsole.join()
  37. 37. 次は、Agent。 オブジェクトにスレッドセーフにアクセスするための 仕組みだよ。
  38. 38. Agentimport static groovyx.gpars.agent.Agentdef 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()
  39. 39. 最後は、Dataflow変数。 変数へのバインドで処理を協調的に行うんだ。
  40. 40. Dataflow変数import static groovyx.gpars.dataflow.DataFlowVariableimport static groovyx.gpars.dataflow.DataFlow.taskfinal 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}
  41. 41. ねぇ、どうだった、まどか? 並行プログラミングをする時はGParsを使ってみるといいかも。
  42. 42. お約束
  43. 43. でも・・・高いんでしょ?
  44. 44. Apache 2 ライセンスの オープンソースだよ。
  45. 45. だから、僕と契約して、 魔法少女になってよ。Groovy使いになってよ。
  46. 46. でも、クーリングオフはできないからね。
  47. 47. ジャパネットQB 完

×