SlideShare a Scribd company logo
1 of 47
Download to read offline
ジャパネットQB

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

    GParsで
 並行プログラミング
一部元ネタを知らないと
楽しめないところがございますが、
  ご了承願います m(_ _)m
こんばんは、
ジャパネットQBの時間だよ。
  今日紹介する商品は、
  GParsだよ、まどか。
お前、誰よ
名前:キュゥべえ(QB)
出身:『魔法少女まどか☆マギカ』(MBS,TBS,CBC)
特徴:腹黒
口癖:「僕と契約してよ。」
ねぇ QB、

GParsって何なの?
GPars(Groovy Parallel Systems)
   ってね、Groovyベースの
並行処理ライブラリのことだよ。
近年のCPUの進化って、
   クロックアップよりも
マルチコア・メニーコア化の方が
     中心だよね。
プログラミングも
 マルチコアを活用すべく、
  並行プログラミングが
意識されるようになったんだ。
まどかは、
並行プログラミングって
   どうしてる?
えっ…
 java.lang.Threadと
java.lang.Runnableと
 synchronizedしか…
私は、
java.util.concurrentパッケージの
  ExecutorServiceやFuture、
     CountDownLatchね。
でもね、Java APIだけで
 並行プログラミングって
なかなか難しいと思わない?
そこで、GParsの出番さ。
GParsは、様々な言語の
並行モデルや調整モデルを
 取り込んでいるんだ。
・JavaのExecutorやFork/Join
・ErlangやScalaのActor
・ClojureのAgent
・OzのDataflow Variable
これらのモデルを
  Groovyをベースに
使いやすく書きやすいように
上手くDSL化してるんだ。
GParsのURLは
http://gpars.codehaus.org/
最新バージョンは0.11、
 昔はGParallelizerって
  呼ばれてたんだよ。
僕と契約してみたく...
GParsを使ってみたくなったでしょ?
えっ…
でも、インストールとか
   大変でしょ?
そんなことないよ。
 Groovy 1.8.0-beta-4から
GParsのライブラリがバンドル
 されるようになったんだ。
Groovyをインストールするだけで、
 GParsも使えるようになるんだ。
そんな説明だけでは、
 ピンと来ないわね。
じゃあ、簡単にだけど、
 GParsの持つ機能を
 いくつか紹介するね。
まず、並列コレクション。
 コレクションに対する操作を
並列に行うことができるんだ。
並列コレクション
import static groovyx.gpars.GParsPool.withPool

def nums = 1..100000
withPool(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]
}
さっきの例は、
もう少し簡潔に書けるんだ。
並列コレクション
import static groovyx.gpars.GParsPool.withPool

def nums = 1..100000
withPool(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]
}
次は、Fork/Join。
 分割統治的な処理を
することができるんだ。
Fork/Join
import static groovyx.gpars.GParsPool.withPool
import 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
    }
}
次は、Closureの非同期実行。
   Closureを簡単に
  非同期実行するんだ。
Closureの非同期実行
import static groovyx.gpars.GParsExecutorsPool.withPool

withPool {
    // 同期
    assert 6 == {it * 2}.call(3)
    // 非同期
    assert 6 == {it * 2}.callAsync(3).get()
}
次は、Actor。
 メールボックスの
メッセージを使用する
軽量のプロセスだね。
Actor
import 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', console
console.join()
次は、Agent。
     オブジェクトに
スレッドセーフにアクセスするための
     仕組みだよ。
Agent
import 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.val
jugMembers.valAsync {println "Current members: $it"}

jugMembers.await()
最後は、Dataflow変数。
  変数へのバインドで
処理を協調的に行うんだ。
Dataflow変数
import static groovyx.gpars.dataflow.DataFlowVariable
import 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
}
ねぇ、どうだった、まどか?
 並行プログラミングをする時は
GParsを使ってみるといいかも。
お約束
でも・・・
高いんでしょ?
Apache 2 ライセンスの
 オープンソースだよ。
だから、僕と契約して、
 魔法少女になってよ。
Groovy使いになってよ。
でも、
クーリングオフはできないからね。
ジャパネットQB

   完

More Related Content

What's hot

Complex Event Processing on Ruby, Fluentd and Norikra #rubykaigi
Complex Event Processing on Ruby, Fluentd and Norikra #rubykaigiComplex Event Processing on Ruby, Fluentd and Norikra #rubykaigi
Complex Event Processing on Ruby, Fluentd and Norikra #rubykaigiSATOSHI TAGOMORI
 
Precise garbage collection for c
Precise garbage collection for cPrecise garbage collection for c
Precise garbage collection for cmiura1729
 
Tarantubeでメッセージキューを使い倒す
Tarantubeでメッセージキューを使い倒すTarantubeでメッセージキューを使い倒す
Tarantubeでメッセージキューを使い倒すMasashi Umezawa
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Takeshi Arabiki
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニングKensuke Nagae
 
Delimited Dynamic Binding
Delimited Dynamic BindingDelimited Dynamic Binding
Delimited Dynamic BindingYouyou Cong
 
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)Kohei KaiGai
 
PostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfacePostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfaceKohei KaiGai
 
巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table について巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table についてHaruka Ozaki
 
CouchDB JP & BigCouch
CouchDB JP & BigCouchCouchDB JP & BigCouch
CouchDB JP & BigCouchYohei Sasaki
 
Tezos Hands on 2019-06-15 Exercise (Japanese)
Tezos Hands on 2019-06-15 Exercise (Japanese)Tezos Hands on 2019-06-15 Exercise (Japanese)
Tezos Hands on 2019-06-15 Exercise (Japanese)Jun Furuse
 
Haskell超初心者勉強会11
Haskell超初心者勉強会11Haskell超初心者勉強会11
Haskell超初心者勉強会11Takashi Kawachi
 
[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也
[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也
[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也Preferred Networks
 
カジュアルにソースコードリーディング
カジュアルにソースコードリーディングカジュアルにソースコードリーディング
カジュアルにソースコードリーディングAkihiro Okuno
 
Stream processing and Norikra
Stream processing and NorikraStream processing and Norikra
Stream processing and NorikraSATOSHI TAGOMORI
 
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2azumakuniyuki 🐈
 
第8回KPF発表資料
第8回KPF発表資料第8回KPF発表資料
第8回KPF発表資料cryks
 

What's hot (20)

Complex Event Processing on Ruby, Fluentd and Norikra #rubykaigi
Complex Event Processing on Ruby, Fluentd and Norikra #rubykaigiComplex Event Processing on Ruby, Fluentd and Norikra #rubykaigi
Complex Event Processing on Ruby, Fluentd and Norikra #rubykaigi
 
Precise garbage collection for c
Precise garbage collection for cPrecise garbage collection for c
Precise garbage collection for c
 
Tarantubeでメッセージキューを使い倒す
Tarantubeでメッセージキューを使い倒すTarantubeでメッセージキューを使い倒す
Tarantubeでメッセージキューを使い倒す
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニング
 
Delimited Dynamic Binding
Delimited Dynamic BindingDelimited Dynamic Binding
Delimited Dynamic Binding
 
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
 
PostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfacePostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join Interface
 
巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table について巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table について
 
CouchDB JP & BigCouch
CouchDB JP & BigCouchCouchDB JP & BigCouch
CouchDB JP & BigCouch
 
Tezos Hands on 2019-06-15 Exercise (Japanese)
Tezos Hands on 2019-06-15 Exercise (Japanese)Tezos Hands on 2019-06-15 Exercise (Japanese)
Tezos Hands on 2019-06-15 Exercise (Japanese)
 
Haskell超初心者勉強会11
Haskell超初心者勉強会11Haskell超初心者勉強会11
Haskell超初心者勉強会11
 
Open stackceilometer
Open stackceilometerOpen stackceilometer
Open stackceilometer
 
[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也
[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也
[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也
 
カジュアルにソースコードリーディング
カジュアルにソースコードリーディングカジュアルにソースコードリーディング
カジュアルにソースコードリーディング
 
Stream processing and Norikra
Stream processing and NorikraStream processing and Norikra
Stream processing and Norikra
 
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2
 
R3.0.0 is relased
R3.0.0 is relasedR3.0.0 is relased
R3.0.0 is relased
 
第8回KPF発表資料
第8回KPF発表資料第8回KPF発表資料
第8回KPF発表資料
 

Viewers also liked

Closures and methodMissing are real
Closures and methodMissing are realClosures and methodMissing are real
Closures and methodMissing are realTakahiro Sugiura
 
Groovyしたり RPしなかったり あとは時々布教活動したり
Groovyしたり RPしなかったり あとは時々布教活動したりGroovyしたり RPしなかったり あとは時々布教活動したり
Groovyしたり RPしなかったり あとは時々布教活動したりTakahiro Sugiura
 

Viewers also liked (7)

GContractsの基礎
GContractsの基礎GContractsの基礎
GContractsの基礎
 
Vert.x.tari.tari
Vert.x.tari.tariVert.x.tari.tari
Vert.x.tari.tari
 
Introduction to Spock
Introduction to SpockIntroduction to Spock
Introduction to Spock
 
Closures and methodMissing are real
Closures and methodMissing are realClosures and methodMissing are real
Closures and methodMissing are real
 
GroovyからAnime
GroovyからAnimeGroovyからAnime
GroovyからAnime
 
Groovyしたり RPしなかったり あとは時々布教活動したり
Groovyしたり RPしなかったり あとは時々布教活動したりGroovyしたり RPしなかったり あとは時々布教活動したり
Groovyしたり RPしなかったり あとは時々布教活動したり
 
Goos 001
Goos 001Goos 001
Goos 001
 

Similar to ジャパネットQB GPars

20170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#820170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#8Kohei KaiGai
 
今日からはじめるGPars
今日からはじめるGPars今日からはじめるGPars
今日からはじめるGParsfumokmm
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回Tomoya Kawanishi
 
20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstrom20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstromKohei KaiGai
 
Shibuya Pm Tt08 Advanced Mogilefs
Shibuya Pm Tt08 Advanced MogilefsShibuya Pm Tt08 Advanced Mogilefs
Shibuya Pm Tt08 Advanced Mogilefsguest172cfb
 
Pythonによる並列プログラミング -GPGPUも-
Pythonによる並列プログラミング   -GPGPUも- Pythonによる並列プログラミング   -GPGPUも-
Pythonによる並列プログラミング -GPGPUも- Yusaku Watanabe
 
Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009Akio Ishida
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LTKohei KaiGai
 
Jpug study-pq 20170121
Jpug study-pq 20170121Jpug study-pq 20170121
Jpug study-pq 20170121Kosuke Kida
 
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016kyoto university
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Yoshifumi Kawai
 
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016Takayuki Shimizukawa
 
Riot + generator で始める新しいデータバインディング
Riot + generator で始める新しいデータバインディングRiot + generator で始める新しいデータバインディング
Riot + generator で始める新しいデータバインディングTsutomu Kawamura
 
怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01nagachika t
 
第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016kyoto university
 
はじめてのPython
はじめてのPythonはじめてのPython
はじめてのPythonKatsumi Honda
 

Similar to ジャパネットQB GPars (20)

20170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#820170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#8
 
今日からはじめるGPars
今日からはじめるGPars今日からはじめるGPars
今日からはじめるGPars
 
RGtk2入門
RGtk2入門RGtk2入門
RGtk2入門
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstrom20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstrom
 
Shibuya Pm Tt08 Advanced Mogilefs
Shibuya Pm Tt08 Advanced MogilefsShibuya Pm Tt08 Advanced Mogilefs
Shibuya Pm Tt08 Advanced Mogilefs
 
Pythonによる並列プログラミング -GPGPUも-
Pythonによる並列プログラミング   -GPGPUも- Pythonによる並列プログラミング   -GPGPUも-
Pythonによる並列プログラミング -GPGPUも-
 
Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009
 
Introduction pp.js
Introduction pp.jsIntroduction pp.js
Introduction pp.js
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT
 
Jpug study-pq 20170121
Jpug study-pq 20170121Jpug study-pq 20170121
Jpug study-pq 20170121
 
Juliaで並列計算
Juliaで並列計算Juliaで並列計算
Juliaで並列計算
 
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
 
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
 
Riot + generator で始める新しいデータバインディング
Riot + generator で始める新しいデータバインディングRiot + generator で始める新しいデータバインディング
Riot + generator で始める新しいデータバインディング
 
怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01
 
第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016
 
はじめてのPython
はじめてのPythonはじめてのPython
はじめてのPython
 

ジャパネットQB GPars