Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Rustのタスクモデルについて

1,514 views

Published on

Rust Tutorialをざっくり説明したものです。Rust Samurai其の弐にて

Published in: Business
  • Be the first to comment

Rustのタスクモデルについて

  1. 1. Rustのタスクモデル @dim7th 9/7 Rust Samurai その弐 13年9月7日土曜日
  2. 2. •学芸大学教育学部2年 •Twitter @dim7th •3Dプリンタとか •scheme, python, C++, Dartとか 自己紹介 13年9月7日土曜日
  3. 3. 1.タスクについて 2.タスクの通信 3.immutableなデータの共有 Rustのタスクモデルについて 13年9月7日土曜日
  4. 4. Rust 0.8-preで話します • RustTasks and CommunicationTutorial • http://static.rust-lang.org/doc/tutorial-tasks.html 13年9月7日土曜日
  5. 5. 1.タスクについて 13年9月7日土曜日
  6. 6. Rustにおけるタスクとは • VMにおけるグリーンスレッドのようなもの • 軽量でタスク間においてはメモリが独立 • タスク間のメッセージ通信が可能 • OSのスレッドにRustのスケジューラが割り当てる • マルチコアであれば並列に割り振られる 13年9月7日土曜日
  7. 7. というわけで実際に 13年9月7日土曜日
  8. 8. タスクを生成してみる fn main(){ spawn( || println("hello")); } 13年9月7日土曜日
  9. 9. fn main(){ spawn( || println("hello")); } Lambda Expression タスクを生成してみる 13年9月7日土曜日
  10. 10. Lambda Expression let func = | arg | { println(fmt!(“arg=%?”,arg)); } func(10) =>10 13年9月7日土曜日
  11. 11. よく使われる形で do spawn() { println(“hello, world!”); } 13年9月7日土曜日
  12. 12. よく使われる形で do spawn() { println(“hello, world!”); } Do Expression 13年9月7日土曜日
  13. 13. spawn( |arg| { hoge(arg) ; }); Do Expression 13年9月7日土曜日
  14. 14. Do Expression spawn( |arg| { hoge(arg) ; }); do spawn |arg| { hoge(arg); } 13年9月7日土曜日
  15. 15. 2.タスクの通信 13年9月7日土曜日
  16. 16. Pipe 13年9月7日土曜日
  17. 17. “A pipe is simply a pair of endpoints” 13年9月7日土曜日
  18. 18. Pipe 13年9月7日土曜日
  19. 19. portchan Pipe 13年9月7日土曜日
  20. 20. Pipe Task Channel Port AnotherTask 13年9月7日土曜日
  21. 21. 実際にやってみる use std : : task; let (port , chan) : (Port<int>, Chan<int>) = stream( ); do spawn | arg | { chan . send (arg); } 13年9月7日土曜日
  22. 22. 実際にやってみる use std : : task; let (port , chan) : (Port<int>, Chan<int>) = stream( ); do spawn | arg | { chan . send (arg); } 型宣言 13年9月7日土曜日
  23. 23. 実際にやってみる use std : : task; let (port , chan) : (Port<int>, Chan<int>) = stream( ); do spawn | arg | { chan . send (arg); } 型宣言 argはport . recv()で取得できる 13年9月7日土曜日
  24. 24. 一つのChanは複数の タスクから使えない 13年9月7日土曜日
  25. 25. 例えば let (port , chan) = stream( ); do spawn | arg1 | { chan . send (arg1); } do spawn | arg2 | { chan . send (arg2); } 13年9月7日土曜日
  26. 26. `chan` moved into closure environment here because it has type `~fn:Send( )`, which is non-copyable (perhaps you meant to use clone( )? ) error: aborting due to previous error 13年9月7日土曜日
  27. 27. 怒られます 13年9月7日土曜日
  28. 28. そこで出てくるのが 13年9月7日土曜日
  29. 29. SharedChan 13年9月7日土曜日
  30. 30. use std : : comm; let (port , chan) = comm : : stream( ); 13年9月7日土曜日
  31. 31. use std : : comm; let (port , chan) = comm : : stream( ); let chan = comm : : SharedChan : : new(chan); 13年9月7日土曜日
  32. 32. use std : : comm; let (port , chan) = comm : : stream( ); let chan = comm : : SharedChan : : new(chan); chanを上書きする 13年9月7日土曜日
  33. 33. use std : : comm; let (port , chan) = comm : : stream( ); let chan = comm : : SharedChan : : new(chan); do spawn | hoge | { let child_chan = chan . clone( ); child_chan.send(arg); } 13年9月7日土曜日
  34. 34. use std : : comm; let (port , chan) = comm : : stream( ); let chan = comm : : SharedChan : : new(chan); do spawn | hoge | { let child_chan = chan . clone( ); child_chan.send(arg); } タスク内でclone( )する 13年9月7日土曜日
  35. 35. Servoではどうなの? servo/src/components/main/servo.rc 151行目らへん 13年9月7日土曜日
  36. 36. 3. immutableなデータの共有 13年9月7日土曜日
  37. 37. Pipeを使ってもできる 13年9月7日土曜日
  38. 38. Pipeを使ってもできる immutableなので 無駄なデータのコピー 13年9月7日土曜日
  39. 39. Auto Reference Counted wrapper 13年9月7日土曜日
  40. 40. extern mod extra; use extra : : arc : :Arc; let (port , chan) = stream( ); let pi = 3.14159; let shared_num = Arc : : new(num); 13年9月7日土曜日
  41. 41. extern mod extra; use extra : : arc : :Arc; let (port , chan) = stream( ); let pi = 3.14159; let shared_num = Arc : : new(num); do spawn { let local_num :Arc<float> = port.recv(); println( fmt!( " % ? ", local_num . get( ))); } 13年9月7日土曜日
  42. 42. http://saneyukis.hatenablog.com/entry/2013/07/28/233325 http://static.rust-lang.org/doc/tutorial-tasks.html http://static.rust-lang.org/doc/rust.html URL 13年9月7日土曜日
  43. 43. 4.タスクの失敗 13年9月7日土曜日
  44. 44. “exceptions in Rust are unrecoverable within a single task: once a task fails, there is no way to "catch" the exception.” http://static.rust-lang.org/doc/tutorial-tasks.html 13年9月7日土曜日
  45. 45. タスクの例外は回復できない 13年9月7日土曜日
  46. 46. 例外はfail!( )を呼ぶことで発生できる 13年9月7日土曜日
  47. 47. let result : Result<( ) , ( )> = do task : : try { fail( ); }; assert!(result . is_err( )); 13年9月7日土曜日
  48. 48. 基本的にタスクが死ぬと 関連するタスク全て死ぬ 13年9月7日土曜日
  49. 49. do spawn{ do spawn { fail( ); } hoge1( ); } hoge2( ); 13年9月7日土曜日

×