Submit Search
Upload
今日からはじめるGPars
•
8 likes
•
3,977 views
F
fumokmm
Follow
「第16回 G*ワークショップ+JGGUG総会」 発表資料 http://kokucheese.com/event/index/12173/
Read less
Read more
Technology
Report
Share
Report
Share
1 of 50
Download now
Download to read offline
Recommended
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Yoshifumi Kawai
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
Koichi Sakata
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
async/await のしくみ
async/await のしくみ
信之 岩永
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Kohsuke Yuasa
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
Swift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhios
Tomohiro Kumagai
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Uehara Junji
Recommended
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Yoshifumi Kawai
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
Koichi Sakata
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
async/await のしくみ
async/await のしくみ
信之 岩永
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Kohsuke Yuasa
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
Swift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhios
Tomohiro Kumagai
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Uehara Junji
ジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansai
Tomohiro Kumagai
クロージャデザインパターン
クロージャデザインパターン
Moriharu Ohzu
Spockの基礎
Spockの基礎
Kiyotaka Oku
emc++ chapter32
emc++ chapter32
Tatsuki SHIMIZU
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16
Mitsuru Kariya
Perl 非同期プログラミング
Perl 非同期プログラミング
lestrrat
C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
YujiSoftware
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
Visual C++で使えるC++11
Visual C++で使えるC++11
nekko1119
Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単に
Yoshifumi Kawai
Em synchrony について
Em synchrony について
Tomoya Kawanishi
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
Kohsuke Yuasa
非同期処理の基礎
非同期処理の基礎
信之 岩永
Xtend30分クッキング やきに駆動
Xtend30分クッキング やきに駆動
Shinichi Kozake
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半
Tetsuya Morimoto
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
Ransui Iso
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
Yoshifumi Kawai
30億のデバイスで走るjavaを支えるjavaエコシステム
30億のデバイスで走るjavaを支えるjavaエコシステム
Shinya Mochida
Groovy 1.8の新機能について
Groovy 1.8の新機能について
Uehara Junji
More Related Content
What's hot
ジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansai
Tomohiro Kumagai
クロージャデザインパターン
クロージャデザインパターン
Moriharu Ohzu
Spockの基礎
Spockの基礎
Kiyotaka Oku
emc++ chapter32
emc++ chapter32
Tatsuki SHIMIZU
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16
Mitsuru Kariya
Perl 非同期プログラミング
Perl 非同期プログラミング
lestrrat
C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
YujiSoftware
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
Visual C++で使えるC++11
Visual C++で使えるC++11
nekko1119
Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単に
Yoshifumi Kawai
Em synchrony について
Em synchrony について
Tomoya Kawanishi
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
Kohsuke Yuasa
非同期処理の基礎
非同期処理の基礎
信之 岩永
Xtend30分クッキング やきに駆動
Xtend30分クッキング やきに駆動
Shinichi Kozake
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半
Tetsuya Morimoto
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
Ransui Iso
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
Yoshifumi Kawai
What's hot
(20)
ジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansai
クロージャデザインパターン
クロージャデザインパターン
Spockの基礎
Spockの基礎
emc++ chapter32
emc++ chapter32
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16
Perl 非同期プログラミング
Perl 非同期プログラミング
C++ マルチスレッド 入門
C++ マルチスレッド 入門
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
Visual C++で使えるC++11
Visual C++で使えるC++11
Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単に
Em synchrony について
Em synchrony について
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
非同期処理の基礎
非同期処理の基礎
Xtend30分クッキング やきに駆動
Xtend30分クッキング やきに駆動
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
Viewers also liked
30億のデバイスで走るjavaを支えるjavaエコシステム
30億のデバイスで走るjavaを支えるjavaエコシステム
Shinya Mochida
Groovy 1.8の新機能について
Groovy 1.8の新機能について
Uehara Junji
GPars in Saga Groovy Study
GPars in Saga Groovy Study
Naoki Rin
Certificate TransparencyによるSSLサーバー証明書公開監査情報とその課題の議論
Certificate TransparencyによるSSLサーバー証明書公開監査情報とその課題の議論
Kenji Urushima
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
Yukiya Nakagawa
Viewers also liked
(6)
30億のデバイスで走るjavaを支えるjavaエコシステム
30億のデバイスで走るjavaを支えるjavaエコシステム
Groovy 1.8の新機能について
Groovy 1.8の新機能について
GPars in Saga Groovy Study
GPars in Saga Groovy Study
Certificate TransparencyによるSSLサーバー証明書公開監査情報とその課題の議論
Certificate TransparencyによるSSLサーバー証明書公開監査情報とその課題の議論
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
Similar to 今日からはじめるGPars
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
ジャパネットQB GPars
ジャパネットQB GPars
Takahiro Sugiura
Kanazawa.js.Next
Kanazawa.js.Next
dynamis
Flow.js
Flow.js
uupaa
Flutterを体験してみませんか
Flutterを体験してみませんか
cch-robo
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
博文 斉藤
Perfect python section5
Perfect python section5
Satoooooooooooo
MoteMote Compiler Plugin
MoteMote Compiler Plugin
yoshiaki iwanaga
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
bitter_fox
Java開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovy
Yasuharu Nakano
Node.js - JavaScript Thread Programming
Node.js - JavaScript Thread Programming
takesako
Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法
yhara
JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門
Shohei Arai
GContractsの基礎
GContractsの基礎
Takahiro Sugiura
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
Akira Takahashi
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
y_taka_23
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
Tomohiro Kumagai
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
Ouka Yuka
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
TanUkkii
Actor&stm
Actor&stm
潤一 加藤
Similar to 今日からはじめるGPars
(20)
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
ジャパネットQB GPars
ジャパネットQB GPars
Kanazawa.js.Next
Kanazawa.js.Next
Flow.js
Flow.js
Flutterを体験してみませんか
Flutterを体験してみませんか
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
Perfect python section5
Perfect python section5
MoteMote Compiler Plugin
MoteMote Compiler Plugin
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
Java開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovy
Node.js - JavaScript Thread Programming
Node.js - JavaScript Thread Programming
Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法
JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門
GContractsの基礎
GContractsの基礎
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
Actor&stm
Actor&stm
Recently uploaded
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
FumieNakayama
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
sugiuralab
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
Hiroki Ichikura
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
akihisamiyanaga1
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
FumieNakayama
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
Yuki Kikuchi
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
Hiroshi Tomioka
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
博三 太田
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
UEHARA, Tetsutaro
Recently uploaded
(9)
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
今日からはじめる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 now