197x 20090704 Scalaで並行プログラミング
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 6,524 views

 

Statistics

Views

Total Views
6,524
Slideshare-icon Views on SlideShare
6,381
Embed Views
143

Actions

Likes
4
Downloads
13
Comments
0

3 Embeds 143

http://d.hatena.ne.jp 126
http://www.slideshare.net 16
http://k.hatena.ne.jp 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • Scalaで並行プログラミング NetPenguin
    • 自己紹介 • 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 2
    • 目次 • Scala • アクターモデル • Scalaのアクターライブラリ • まとめ 3
    • Scala • オブジェクト指向+関数型 • JVM上で動作 • ScalaからJavaのライブラリを利用可能 JavaからScalaのメソッドを呼び出すことも可能 • 変態豊富な言語機能 – Implicit parameter, Implicit conversion, Trait, Structual typing, Pattern match – Partial Function, タプル, Immutableなリスト, etc... 4
    • Scala • その他 – TwitterもScalaで動いているらしいです – マスコットキャラも出来たようです・・・ 5
    • • 魔法少女 Scala ちゃん id:secondlife さんのところから拝借しました。 ●http://subtech.g.hatena.ne.jp/secondlife/20090701/1246418689# 6
    • アクターモデル • 全てのものはアクターである – OOの「すべてのものはオブジェクトである」 と同じようなもの • 基本的に非同期メッセージを使用 – OOでは基本的に同期メッセージ – アクタ間のやり取りはメッセージのみ • 状態は各アクターに閉じている 7
    • 自然と並行に動作可能 8
    • Scalaのアクターライブラリ • 特徴 – 言語の一部のように見える構文 – パターンマッチ – スレッドを無駄使いしない • やれること – アクターの生成/開始 – メッセージ送信 – メッセージ受信 – メッセージ返信 9
    • アクターの生成/開始(1) • Actorクラスを継承 – Actorクラスを継承し、actメソッドを実装する – start メソッドを呼び出して、アクターを開始する class SampleActor extends Actor { def act():Unit = { : } } object Sample { def main(args: Array[String]):Unit = { new SampleActor().start } } 10
    • アクターの生成/開始(2) • Actor.actor メソッドで生成 – actor に続くブロックが act メソッドに相当 – ただちに開始される(start不要) import scala.actors.Actor.actor object Sample { def main(args: Array[String]):Unit = { actor { : : } } } 11
    • メッセージ送信 • 任意のオブジェクトを送信可能 • !、!?、!!でメッセージ送信 – ! → 一方通行 – !? → 返信を待つ – !! → 返信受信時にコールバック def main(args: Array[String]):Unit = { val sample = actor { ... } sample ! “message” // 文字列を送信 println(sample !? 1) // 数値を送信、返信を出力 } 12
    • メッセージ受信(1) • receiveで受信 – メッセージが届くまでスレッドを止めて待つ (メッセージ待ち中もスレッドを消費する) – reveiveの外側に値を返すことができる actor { val result = receive { case t: String => println(“receive text. text=”+t) “text” // result == “text” になる case 1 => println(“receive number.”) “number” // result == “number” になる } } 13
    • メッセージ受信(2) • reactで受信 – メッセージ処理中のみスレッドを使用する – reactの外側に値を返すことはできない actor { react { case t: String => println(“receive text. text=”+t) case 1 => println(“receive number.”) } } 14
    • メッセージ受信(その他) • 受信を繰り返す – loopで囲う actor { loop { react { case t: String => println(“receive text. text=”+t) case 1 => println(“receive number.) } } } 15
    • メッセージ返信 • reply で返信 – 任意のオブジェクトを返信できる – !?, !! によるメッセージ送信側で受け取ることができる actor { loop { react { case t: String => reply “receive ”+t case 1 => reply “receive 1st” } } } 16
    • 試してみた • クイックソート – 10,000個の整数をソート×100回 • すべてをアクターにしてみた – 分割(Separator) – 結合(Combaine) • 大量にアクターを生成 – 分割毎にアクタ生成 ※ソースはhttp://svn.coderepos.org/share/lang/scala  /sandbox/samples/actor/ に置いてあります 17
    • 結果 • CPU使用率80~90% (Core2Quad 2.4GHz) 18
    • 結果 • すべてをアクターにすると – メモリを大量消費 – オーバーヘッドで遅かった(10倍くらい) • 通常のソート → 2~3秒 • アクター使用 → 28秒 _| ̄|○ 19
    • まとめ • 自然と並行処理になる • 同期処理不要 • CPUパワーを余すことなく使える • アクターの粒度はほどほどに 20
    • ご静聴、ありがとうございました。 21