21
Scalaで並行プログラミング NetPenguin

197x 20090704 Scalaで並行プログラミング

Embed Size (px)

Citation preview

Page 1: 197x 20090704 Scalaで並行プログラミング

Scalaで並行プログラミング

NetPenguin

Page 2: 197x 20090704 Scalaで並行プログラミング

2

自己紹介• NetPenguin

– http://d.hatena.ne.jp/NetPenguin/– http://twitter.com/NetPenguin/

• プログラマ(否SE)• Java, Scala, C/C++, PHP, etc...• Scala-be

– http://groups.google.co.jp/group/scala-be

Page 3: 197x 20090704 Scalaで並行プログラミング

3

目次• Scala• アクターモデル• Scalaのアクターライブラリ• まとめ

Page 4: 197x 20090704 Scalaで並行プログラミング

4

Scala• オブジェクト指向+関数型• JVM上で動作• ScalaからJavaのライブラリを利用可能

JavaからScalaのメソッドを呼び出すことも可能• 変態豊富な言語機能

– Implicit parameter, Implicit conversion, Trait, Structual typing, Pattern match

– Partial Function, タプル, Immutableなリスト,etc...

Page 5: 197x 20090704 Scalaで並行プログラミング

5

Scala• その他

– TwitterもScalaで動いているらしいです– マスコットキャラも出来たようです・・・

Page 6: 197x 20090704 Scalaで並行プログラミング

6

• 魔法少女 Scala ちゃん

id:secondlife さんのところから拝借しました。●http://subtech.g.hatena.ne.jp/secondlife/20090701/1246418689#

Page 7: 197x 20090704 Scalaで並行プログラミング

7

アクターモデル• 全てのものはアクターである

– OOの「すべてのものはオブジェクトである」と同じようなもの

• 基本的に非同期メッセージを使用– OOでは基本的に同期メッセージ– アクタ間のやり取りはメッセージのみ

• 状態は各アクターに閉じている

Page 8: 197x 20090704 Scalaで並行プログラミング

8

自然と並行に動作可能

Page 9: 197x 20090704 Scalaで並行プログラミング

9

Scalaのアクターライブラリ• 特徴

– 言語の一部のように見える構文– パターンマッチ– スレッドを無駄使いしない

• やれること– アクターの生成/開始– メッセージ送信– メッセージ受信– メッセージ返信

Page 10: 197x 20090704 Scalaで並行プログラミング

10

• Actorクラスを継承– Actorクラスを継承し、actメソッドを実装する– start メソッドを呼び出して、アクターを開始する

アクターの生成/開始(1)

class SampleActor extends Actor { def act():Unit = { : }}object Sample { def main(args: Array[String]):Unit = { new SampleActor().start }}

Page 11: 197x 20090704 Scalaで並行プログラミング

11

import scala.actors.Actor.actor object Sample { def main(args: Array[String]):Unit = { actor { : : } }}

• Actor.actor メソッドで生成– actor に続くブロックが act メソッドに相当– ただちに開始される(start不要)

アクターの生成/開始(2)

Page 12: 197x 20090704 Scalaで並行プログラミング

12

• 任意のオブジェクトを送信可能• !、!?、!!でメッセージ送信

– ! → 一方通行– !? → 返信を待つ– !! → 返信受信時にコールバック

メッセージ送信

def main(args: Array[String]):Unit = { val sample = actor { ... } sample ! “message” // 文字列を送信 println(sample !? 1) // 数値を送信、返信を出力}

Page 13: 197x 20090704 Scalaで並行プログラミング

13

• receiveで受信– メッセージが届くまでスレッドを止めて待つ

(メッセージ待ち中もスレッドを消費する)– reveiveの外側に値を返すことができる

メッセージ受信(1)

actor { val result = receive { case t: String => println(“receive text. text=”+t) “text” // result == “text” になる case 1 => println(“receive number.”) “number” // result == “number” になる }}

Page 14: 197x 20090704 Scalaで並行プログラミング

14

• reactで受信– メッセージ処理中のみスレッドを使用する– reactの外側に値を返すことはできない

メッセージ受信(2)

actor { react { case t: String => println(“receive text. text=”+t) case 1 => println(“receive number.”) }}

Page 15: 197x 20090704 Scalaで並行プログラミング

15

• 受信を繰り返す– loopで囲う

メッセージ受信(その他)

actor { loop { react { case t: String => println(“receive text. text=”+t) case 1 => println(“receive number.) } }}

Page 16: 197x 20090704 Scalaで並行プログラミング

16

• reply で返信– 任意のオブジェクトを返信できる– !?, !! によるメッセージ送信側で受け取ることができる

メッセージ返信

actor { loop { react { case t: String => reply “receive ”+t case 1 => reply “receive 1st” } }}

Page 17: 197x 20090704 Scalaで並行プログラミング

17

試してみた• クイックソート

– 10,000個の整数をソート×100回• すべてをアクターにしてみた

– 分割(Separator)– 結合(Combaine)

• 大量にアクターを生成– 分割毎にアクタ生成

※ソースはhttp://svn.coderepos.org/share/lang/scala /sandbox/samples/actor/ に置いてあります

Page 18: 197x 20090704 Scalaで並行プログラミング

18

結果• CPU使用率80~90%

(Core2Quad 2.4GHz)

Page 19: 197x 20090704 Scalaで並行プログラミング

19

結果• すべてをアクターにすると

– メモリを大量消費– オーバーヘッドで遅かった(10倍くらい)

• 通常のソート → 2~3秒• アクター使用 → 28秒

_| ̄|○

Page 20: 197x 20090704 Scalaで並行プログラミング

20

まとめ• 自然と並行処理になる• 同期処理不要• CPUパワーを余すことなく使える• アクターの粒度はほどほどに

Page 21: 197x 20090704 Scalaで並行プログラミング

21

ご静聴、ありがとうございました。