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

850
-1

Published on

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

Published in: Business
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
850
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
4
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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日土曜日

×