Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
fumokmm
PDF, PPTX
3,988 views
今日からはじめるGPars
「第16回 G*ワークショップ+JGGUG総会」 発表資料 http://kokucheese.com/event/index/12173/
Technology
◦
Read more
8
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 50
2
/ 50
3
/ 50
4
/ 50
5
/ 50
6
/ 50
7
/ 50
8
/ 50
9
/ 50
10
/ 50
11
/ 50
12
/ 50
13
/ 50
14
/ 50
15
/ 50
16
/ 50
17
/ 50
18
/ 50
19
/ 50
20
/ 50
21
/ 50
22
/ 50
23
/ 50
24
/ 50
25
/ 50
26
/ 50
27
/ 50
28
/ 50
29
/ 50
30
/ 50
31
/ 50
32
/ 50
33
/ 50
34
/ 50
35
/ 50
36
/ 50
37
/ 50
38
/ 50
39
/ 50
40
/ 50
41
/ 50
42
/ 50
43
/ 50
44
/ 50
45
/ 50
46
/ 50
47
/ 50
48
/ 50
49
/ 50
50
/ 50
More Related Content
PDF
Deep Dive async/await in Unity with UniTask(UniRx.Async)
by
Yoshifumi Kawai
PPTX
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
by
Koichi Sakata
PDF
C#次世代非同期処理概観 - Task vs Reactive Extensions
by
Yoshifumi Kawai
PPTX
async/await のしくみ
by
信之 岩永
PDF
C++ マルチスレッドプログラミング
by
Kohsuke Yuasa
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
by
Yoshifumi Kawai
PDF
Swift 2.0 の Error Handling #yhios
by
Tomohiro Kumagai
KEY
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
by
Uehara Junji
Deep Dive async/await in Unity with UniTask(UniRx.Async)
by
Yoshifumi Kawai
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
by
Koichi Sakata
C#次世代非同期処理概観 - Task vs Reactive Extensions
by
Yoshifumi Kawai
async/await のしくみ
by
信之 岩永
C++ マルチスレッドプログラミング
by
Kohsuke Yuasa
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
by
Yoshifumi Kawai
Swift 2.0 の Error Handling #yhios
by
Tomohiro Kumagai
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
by
Uehara Junji
What's hot
PDF
ジェネリック関数の呼び出され方 #cocoa_kansai
by
Tomohiro Kumagai
PDF
クロージャデザインパターン
by
Moriharu Ohzu
PDF
Spockの基礎
by
Kiyotaka Oku
PDF
emc++ chapter32
by
Tatsuki SHIMIZU
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
by
Unity Technologies Japan K.K.
PDF
Effective Modern C++ 勉強会#3 Item16
by
Mitsuru Kariya
KEY
Perl 非同期プログラミング
by
lestrrat
PDF
C++ マルチスレッド 入門
by
京大 マイコンクラブ
PPTX
BoostAsioで可読性を求めるのは間違っているだろうか
by
Yuki Miyatake
PPTX
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
by
YujiSoftware
PDF
組み込みでこそC++を使う10の理由
by
kikairoya
PPTX
Visual C++で使えるC++11
by
nekko1119
PDF
Reactive Extensionsで非同期処理を簡単に
by
Yoshifumi Kawai
PDF
Em synchrony について
by
Tomoya Kawanishi
PDF
規格書で読むC++11のスレッド
by
Kohsuke Yuasa
PPTX
非同期処理の基礎
by
信之 岩永
PDF
Xtend30分クッキング やきに駆動
by
Shinichi Kozake
PDF
エキ Py 読書会02 2章後半
by
Tetsuya Morimoto
PDF
Lisp Tutorial for Pythonista Day 6
by
Ransui Iso
PDF
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
by
Yoshifumi Kawai
ジェネリック関数の呼び出され方 #cocoa_kansai
by
Tomohiro Kumagai
クロージャデザインパターン
by
Moriharu Ohzu
Spockの基礎
by
Kiyotaka Oku
emc++ chapter32
by
Tatsuki SHIMIZU
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
by
Unity Technologies Japan K.K.
Effective Modern C++ 勉強会#3 Item16
by
Mitsuru Kariya
Perl 非同期プログラミング
by
lestrrat
C++ マルチスレッド 入門
by
京大 マイコンクラブ
BoostAsioで可読性を求めるのは間違っているだろうか
by
Yuki Miyatake
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
by
YujiSoftware
組み込みでこそC++を使う10の理由
by
kikairoya
Visual C++で使えるC++11
by
nekko1119
Reactive Extensionsで非同期処理を簡単に
by
Yoshifumi Kawai
Em synchrony について
by
Tomoya Kawanishi
規格書で読むC++11のスレッド
by
Kohsuke Yuasa
非同期処理の基礎
by
信之 岩永
Xtend30分クッキング やきに駆動
by
Shinichi Kozake
エキ Py 読書会02 2章後半
by
Tetsuya Morimoto
Lisp Tutorial for Pythonista Day 6
by
Ransui Iso
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
by
Yoshifumi Kawai
Viewers also liked
PDF
30億のデバイスで走るjavaを支えるjavaエコシステム
by
Shinya Mochida
KEY
Groovy 1.8の新機能について
by
Uehara Junji
PDF
GPars in Saga Groovy Study
by
Naoki Rin
PDF
Certificate TransparencyによるSSLサーバー証明書公開監査情報とその課題の議論
by
Kenji Urushima
PDF
Javaはどのように動くのか~スライドでわかるJVMの仕組み
by
Chihiro Ito
PDF
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
by
Yukiya Nakagawa
30億のデバイスで走るjavaを支えるjavaエコシステム
by
Shinya Mochida
Groovy 1.8の新機能について
by
Uehara Junji
GPars in Saga Groovy Study
by
Naoki Rin
Certificate TransparencyによるSSLサーバー証明書公開監査情報とその課題の議論
by
Kenji Urushima
Javaはどのように動くのか~スライドでわかるJVMの仕組み
by
Chihiro Ito
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
by
Yukiya Nakagawa
Similar to 今日からはじめるGPars
PDF
ジャパネットQB GPars
by
Takahiro Sugiura
PDF
197x 20090704 Scalaで並行プログラミング
by
Net Penguin
PDF
GParsの?Actor Model
by
pocketberserker
PPT
G*workshop sendai 20100424(v2)
by
Nobuhiro Sue
PDF
Java開発の強力な相棒として今すぐ使えるGroovy
by
Yasuharu Nakano
PDF
G* Workshop in Fukuoka - Introduction
by
Kazuchika Sekiya
PDF
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
by
TanUkkii
PDF
Akka stream
by
Masaki Toyoshima
KEY
Aizu lt tokyo_luxion
by
Tomoaki Tamura
PDF
WebSocket+Akka(Remote)+Play 2.1 Java
by
Kazuhiro Hara
PDF
Error handling in Erlang and Scala
by
Masahito Ikuta
PDF
rpscala35-scala2.9.0
by
Kenji Yoshida
PPT
第5回勉強会
by
Mugen Fujii
PDF
Akka入門
by
Masashi (Jangsa) Kawaguchi
PDF
Groovyの紹介20130323
by
Yasuharu Hayami
ODP
こんにちはGroovy
by
irof N
PPT
第4回勉強会 Groovyの文法からSpockまで
by
Mugen Fujii
PDF
Clojure
by
Uehara Junji
KEY
サイボウズ・ラボユース 最終成果報告会プレゼンテーション
by
sn_monochr
PDF
ラボユース 最終成果報告会
by
shiftky
ジャパネットQB GPars
by
Takahiro Sugiura
197x 20090704 Scalaで並行プログラミング
by
Net Penguin
GParsの?Actor Model
by
pocketberserker
G*workshop sendai 20100424(v2)
by
Nobuhiro Sue
Java開発の強力な相棒として今すぐ使えるGroovy
by
Yasuharu Nakano
G* Workshop in Fukuoka - Introduction
by
Kazuchika Sekiya
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
by
TanUkkii
Akka stream
by
Masaki Toyoshima
Aizu lt tokyo_luxion
by
Tomoaki Tamura
WebSocket+Akka(Remote)+Play 2.1 Java
by
Kazuhiro Hara
Error handling in Erlang and Scala
by
Masahito Ikuta
rpscala35-scala2.9.0
by
Kenji Yoshida
第5回勉強会
by
Mugen Fujii
Akka入門
by
Masashi (Jangsa) Kawaguchi
Groovyの紹介20130323
by
Yasuharu Hayami
こんにちはGroovy
by
irof N
第4回勉強会 Groovyの文法からSpockまで
by
Mugen Fujii
Clojure
by
Uehara Junji
サイボウズ・ラボユース 最終成果報告会プレゼンテーション
by
sn_monochr
ラボユース 最終成果報告会
by
shiftky
今日からはじめるGPars
1.
今日からはじめる GPars
2011-06-17 第16回 G*ワークショップ 吉田 健太郎 (@fumokmm)
2.
自己紹介 名前:吉田 健太郎(ふも) 仕事:プログラマ! Twitter:@fumokmm はてな:id:fumokmm ブログ:No Programming,
No Life http://d.hatena.ne.jp/fumokmm/ 活動: ● JGGUG運営委員 ● Grailsドキュメント会参加 ● G*Magazine vol.2「もし新人女子Javaプログラマが 『Groovyイン・アクション』を読んだら」
3.
GParsとはなにか Groovy Parallel
Systems http://gpars.codehaus.org/ 読み方は「じーぱーず」
4.
GParsとはなにか GParsはGroovyベースの並列処理ライブラリ群 他の言語の並列処理で使われている技術のいいとこど りをしていったらすごいことになってしまったライブ ラリ。 ほとんどJavaで書かれてるから、速度は問題ない Javaからも使える。(若干面倒だけど) Groovy v1.8から本体にバンドルされるようになった のはGPars v0.11
で、最新版はv0.12。 v1.8な人はインポートするだけで使える。 そうじゃない人は、@Grabればいい。 @Grab('org.codehaus.gpars:gpars:0.12')
5.
本日のメニュー 非同期コレクション ▶ アクター エージェント データフロー まとめ
6.
非同期コレクション
7.
並列コレクションとは コレクションに対する並列処理を簡単に提供。 並列コレクションはJavaの並列処理ライブラリ のラッパーを提供。 ●
並列コレクションは JSR 166 ● Fork/Join は JSR 166y (Java 7) ● Map/Filter/Reduce
8.
並列コレクションなハロワ import static groovyx.gpars.GParsPool.* def
numbers = [1, 2, 3, 4, 5, 6] def squares = [1, 4, 9, 16, 25, 36] withPool { assert squares == numbers.collectParallel { it * it } } parallel_collection01.groovy まず、並列処理したい部分をwithPoolで囲む。 ここの例では parallel に collect している。
9.
parallelにeachしてみる import static groovyx.gpars.GParsPool.* def
numbers = 0..9 withPool { numbers.eachParallel { print it } } parallel_collection02.groovy 出力例(毎回異なる): 0213756489 Result: 0..9
10.
parallelメソッド対応表 通常のメソッドと withPool内で 使えるようになる parallel
なメソッドの対応表
11.
withPoolについて import static groovyx.gpars.GParsPool.* withPool(10)
{ // 10スレッド分スレッドが入るプールを確保 // この中で自由にスレッドを泳がせてね } withPoolはデフォルトではコア数+1のスレッドを使う。 第一引数でスレッド数を指定可能。 例) Core 2 な場合、デフォルトではスレッド数は3。
12.
makeTransparent import static groovyx.gpars.GParsPool.* withPool
{ def numbers = [1, 2, 3, 4, 5, 6].makeTransparent() def squares = [1, 4, 9] assert squares == numbers.collect{ it * it } .grep{ it < 10 } } parallel_collection03.groovy .makeTransparent() しておくと、いちいち 〜Parallel しなくて済むからちょっとだけシンプルに書ける。 ※注意※ v0.12から名前が .makeConcurrent() に変更に なっています。
13.
map/filter/reduce import static groovyx.gpars.GParsPool.* withPool
{ assert 30 == [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].parallel .filter { it <= 5 } .map { it * 2 } .reduce { a, b -> a + b } } parallel_collection04.groovy コレクションに .parallel を付けると、 関数型っぽくmap/filter/reduceできるようになります。
14.
map/filter/reduceメソッド対応表
15.
例:文字数カウント import static groovyx.gpars.GParsPool.* def
words = "This is just a plain text to count words in" print count(words) def count(arg) { withPool { return arg.parallel .map{[it, 1]} .groupBy{it[0]}.getParallel() .map {it.value=it.value.size();it} .sort{-it.value} .collection } } parallel_collection05.groovy 結果はラップされているので、最後に .collection を付ける 必要がある。.groupByなどたまに対応してないメソッドが あるので、.getParallel() しなおしてあげる必要がある。
16.
例:スリープソート import static groovyx.gpars.GParsPool.* import
java.util.concurrent.* def numbers = [8, 1, 4, 9, 3, 6] def latch = new CountDownLatch(numbers.size()) // numbersのサイズ分、スレッド確保 withPool(numbers.size() ?: 1){ numbers.eachParallel { latch.countDown() latch.await() // 全部の準備が終わるまで待つ Thread.sleep((it as int) * 10) println it } } sleepSortSample.groovy cf. http://d.hatena.ne.jp/fumokmm/20110611/1307811572
17.
例:フィボナッチ数 (Fork/Join) import static
groovyx.gpars.GParsPool.* def fibo(num) { withPool { runForkJoin(num) { n -> switch (n) { case 0..1: return n default: forkOffChild(n - 1) forkOffChild(n - 2) [*childrenResults].flatten().sum() } } } } assert fibo(10) == 55 fibonacciSample.groovy JSR 166yのfork/join機能をGParsのラッパーから使う例。
18.
M/F/R vs Fork/Join
19.
本日のメニュー 非同期コレクション アクター ▶ エージェント データフロー まとめ
20.
アクター
21.
アクターとは
メッセージ 返信 基本ステップ アクターはそれぞれ、独立したスレッド(世界)で動く。 自分とは別のアクターとやり取りするには、メッセージを送る。 メッセージを受け取ったアクターはメッセージに返信することが できる。
22.
アクターなハロワ import static groovyx.gpars.actor.Actors.* def
console = actor { loop { react { msg -> println msg } } } console.send('Hello World!') actor01.groovy アクターを生成するには、actor { … } DSLを使う。 loopはstop()されるまで、繰り返される。 最後に、consoleアクターに 'Hello World!' という String をメッセージとして送信している。
23.
.send の別記法 console.send('Hello World!') console
<< 'Hello World!' // << でもOK console.call('Hello World!') // .callでもOK console 'Hello World!' // .call=クロージャ呼び出し メッセージ送信のためのメソッド .send には別記法が 用意されている。(種類は上記コード参照) ErlangやScalaなどで使う ! は Groovyではオーバーロード できないので違う記法を採用している。
24.
メインスレッドがアクターに送信 import static groovyx.gpars.actor.Actors.* def
console = actor { loop { react { msg -> println msg } } } // 出力順はばらばら console << 'Hello World!' println 'finish.' actor02.groovy
25.
メインスレッドがアクターに送信 import static groovyx.gpars.actor.Actors.* def
console = actor { loop { react { msg -> println msg } } } console << 'Hello World!' console.stop() // <- consoleのアクターをストップ console.join() // <- メインスレッドで、console // アクターが終わるまで待つ println 'finish.' actor03.groovy
26.
高度なloop def whileTrue =
{-> // 繰り返し条件を返すクロージャ(真の間繰り返す) } def printResult = {-> // ループ終了時に呼び出されるクロージャ } loop(whileTrue, printResult) { // アクターに行わせる処理 } actor04.groovy loopの第一引数に繰り返し条件(真の間繰り返し)を返す クロージャやint(繰り返し回数)を指定することでループ 回数を制御できる。 第二引数にクロージャを渡すと、loop終了時に実行される (フック処理)
27.
reactor (リアクター) import static
groovyx.gpars.actor.Actors.* def console = actor { loop { react { msg -> println msg } } } // 同じ def console2 = reactor { msg println msg } actor05.groovy loop-react の組み合わせはよく使うので 用意された便利DSL。リアクション専用。
28.
sender(送り主) react { tweet
-> if (isSpam(tweet)) { ignoreTweetsFrom sender // 通報 } sender.send '二度と送って来ないでね!' } senderはactorのクロージャ内部で、送信元を特定する のに使える。
29.
reply(返信) import static groovyx.gpars.actor.Actors.* def
replyingActor = reactor { msg -> println "受信: $msg" reply "<<$msg>>" } def reply = replyingActor.sendAndWait('メッセージ 1') assert reply == '<<メッセージ1>>' actor06.groovy ここでは、msgを受け取って、<< と >> で囲ったものを 返却している。 .sendAndWait はメッセージを送信した後、アクターから の返信を待つ。
30.
メッセージ振り分け(switch-case) loop {
react { text -> switch(text) { case String : reply << "あなたの送ったのはString" break case Integer: reply << "あなたの送ったのはInteger" break } } } 一番単純な振り分け。受け取ったメッセージを switch-case式を用いて振り分けている。 Groovyのswitch-caseはそれなりに強力なのでこれでも 十分強力かもしれないが、もっといい方法がある。
31.
メッセージ振り分け(when) import static groovyx.gpars.actor.Actors.* def
handler = messageHandler { when { String message -> reply '文字列' } when { Number message -> reply '数字' } } assert '文字列' == handler.sendAndWait('こんにちは') assert '数字' == handler.sendAndWait(123) actor07.groovy MessageHandler { … } DSLを使うと when に渡すクロージャ のバリエーションでメッセージを振り分けることができる。
32.
比較:Scalaアクターの
メッセージ振り分け val badActor = actor { var done = false while (! done) { receive { case NegotiateNewContract => // 処理 case Speak(line) => // 処理 case _ => // 全部マッチしなかった時の処理 } } } badActor ! NegotiateNewContract badActor ! Speak("Do ya feel lucky, punk?"
33.
メッセージについて GParsのメッセージはイミュータブルにする必 要はない(強制されてはいない)が、送信した あとはむやみに触るべきではない。 他の言語(Erlang)とかはそもそもすべてがイ ミュータブルなので、ここらへんは心配しなく てよい。 Scalaはcase classにしたりして、パターン マッチでメッセージを受け取っている。 (1ページ前の比較を参照)
34.
本日のメニュー 非同期コレクション アクター エージェント ▶ データフロー まとめ
35.
エージェント
36.
エージェントとは 並列処理環境においてミュータブルなデータを 安全に取り扱うのは難しい。 そこでエージェントを使い、データの更新を ラップする。 この機能はClojure由来。
37.
エージェントなハロワ import groovyx.gpars.agent.Agent def guard
= new Agent<String>() guard { updateValue('GPars') } guard { updateValue(it + ' is groovy!') } assert 'GPars is groovy!' == guard.val agent01.groovy エージェントが内包する値の更新は、クロージャを通して 行うことになる。 結果値は .val で取得できる。
38.
リストに追加 import groovyx.gpars.agent.Agent def members
= new Agent(['Me']) members.send {it.add 'A'} def t1 = Thread.start { members.send {it.add 'B' } } def t2 = Thread.start { members << { it.add 'C' } members { it.add 'D' } } [t1, t2]*.join() println members.val members.valAsync {println "現在のメンバ: $it" } members.await() agent02.groovy 複数スレッドから同時に更新をかけてもリストは壊れない。 エージェントが守っているから。
39.
リスナーとバリデータを追加 import groovyx.gpars.agent.Agent def counter
= new Agent() counter.addListener{ oldVal, newVal -> println "$oldVal -> $newVal" } counter.addValidator{ oldVal, newVal -> if (newVal < oldVal) throw new Exception('新しい値が小さいのでエラー') } . . . assert counter.hasErrors() assert 1 == counter.errors.size() agent03.groovy 値の更新時に通知したり、チェックしたりするクロージャを 追加することができる。エラーがあったかは後でチェック。
40.
本日のメニュー 非同期コレクション アクター エージェント データフロー ▶ まとめ
41.
データフロー
42.
データフローとは タスクという単位に処理を切り分けて記述して ゆく。 タスクの順番的な依存関係はデータフローがい い感じに解決してくれる。
43.
データフローなハロワ import groovyx.gpars.dataflow.DataFlows import static
groovyx.gpars.dataflow.DataFlow.* def flow = new DataFlows() task { flow.result = flow.x + flow.y } // task { flow.x = 10 } // task { flow.y = 5 } // assert 15 == flow.result // dataflow01.groovy ①、②、③の順番で代入が実行される。 ②の flow.result は ①の flow.x, flow.y が代入されるまで待機 する ③の flow.result は ①の flow.result が代入されるまで待機する
44.
デッドロックにご用心 import groovyx.gpars.dataflow.DataFlows import static
groovyx.gpars.dataflow.DataFlow.* def flow = new DataFlows() task { flow.x = flow.y } task { flow.y = flow.x } // デッドロック! println flow.x // 帰ってこない dataflow02.groovy デッドロックが発生する例。 flow.x のようにしなければ、帰ってくる。
45.
本日のメニュー 非同期コレクション アクター エージェント データフロー まとめ
▶
46.
まとめ GParsでだいたいどんなことができるかわかっ て頂けたかと思います。 エージェントとデータフローの内容が薄いのは まとめきれてないだけです・・・(反省)本当 はもっと多機能なので、ご興味が湧かれた方は ぜひ調べてみて下さい。 GParsで日常の小さな部分からコツコツと簡単 に並列処理化をはじめてみませんか?
47.
まとめ GParsは クロージャ、DSL、MOPなどの Groovy機能を駆使して JVMの強力な並列処理機能を シンプルに使いこなす Groovy流のやり方だった
48.
参考 ●
Groovy in Action, Second Edition http://www.manning.com/koenig2/ ● GPars Javadoc http://gpars.org/0.12/javadoc/ ● GPars ユーザガイド&リファレンス http://gpars.org/0.12/guide/index.html
49.
告知:GParsドキュメント翻訳中 現在GParsユーザガイド(v0.12)の翻訳作業を Google
Translator Toolkit上で行っています。 http://goo.gl/d1LHM 参加者:ふも(@fumokmm) 杉浦さん(@touchez_du_bois) 協力者大募集中! @fumokmm までご連絡下さい。
50.
ご清聴 ありがとうございました
Download