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のタスクモデル
@dim7th
9/7 Rust Samurai その弐
13年9月7日土曜日
•学芸大学教育学部2年
•Twitter @dim7th
•3Dプリンタとか
•scheme, python, C++, Dartとか
自己紹介
13年9月7日土曜日
1.タスクについて
2.タスクの通信
3.immutableなデータの共有
Rustのタスクモデルについて
13年9月7日土曜日
Rust 0.8-preで話します
• RustTasks and CommunicationTutorial
• http://static.rust-lang.org/doc/tutorial-tasks.html
13年9月7日土曜日
1.タスクについて
13年9月7日土曜日
Rustにおけるタスクとは
• VMにおけるグリーンスレッドのようなもの
• 軽量でタスク間においてはメモリが独立
• タスク間のメッセージ通信が可能
• OSのスレッドにRustのスケジューラが割り当てる
• マルチコアであれば並列に割り振ら...
というわけで実際に
13年9月7日土曜日
タスクを生成してみる
fn main(){
spawn( || println("hello"));
}
13年9月7日土曜日
fn main(){
spawn( || println("hello"));
}
Lambda Expression
タスクを生成してみる
13年9月7日土曜日
Lambda Expression
let func = | arg | {
println(fmt!(“arg=%?”,arg));
}
func(10)
=>10
13年9月7日土曜日
よく使われる形で
do spawn() {
println(“hello, world!”);
}
13年9月7日土曜日
よく使われる形で
do spawn() {
println(“hello, world!”);
}
Do Expression
13年9月7日土曜日
spawn( |arg| {
hoge(arg) ;
});
Do Expression
13年9月7日土曜日
Do Expression
spawn( |arg| {
hoge(arg) ;
});
do spawn |arg| {
hoge(arg);
}
13年9月7日土曜日
2.タスクの通信
13年9月7日土曜日
Pipe
13年9月7日土曜日
“A pipe is simply
a pair of endpoints”
13年9月7日土曜日
Pipe
13年9月7日土曜日
portchan
Pipe
13年9月7日土曜日
Pipe
Task
Channel
Port
AnotherTask
13年9月7日土曜日
実際にやってみる
use std : : task;
let (port , chan) : (Port<int>, Chan<int>) = stream( );
do spawn | arg | {
chan . send (arg);
}...
実際にやってみる
use std : : task;
let (port , chan) : (Port<int>, Chan<int>) = stream( );
do spawn | arg | {
chan . send (arg);
}...
実際にやってみる
use std : : task;
let (port , chan) : (Port<int>, Chan<int>) = stream( );
do spawn | arg | {
chan . send (arg);
}...
一つのChanは複数の
タスクから使えない
13年9月7日土曜日
例えば
let (port , chan) = stream( );
do spawn | arg1 | {
chan . send (arg1);
}
do spawn | arg2 | {
chan . send (arg2);
}
13年...
`chan` moved into closure
environment here
because it has type `~fn:Send( )`,
which is non-copyable
(perhaps you meant to ...
怒られます
13年9月7日土曜日
そこで出てくるのが
13年9月7日土曜日
SharedChan
13年9月7日土曜日
use std : : comm;
let (port , chan) = comm : : stream( );
13年9月7日土曜日
use std : : comm;
let (port , chan) = comm : : stream( );
let chan = comm : : SharedChan : : new(chan);
13年9月7日土曜日
use std : : comm;
let (port , chan) = comm : : stream( );
let chan = comm : : SharedChan : : new(chan);
chanを上書きする
13年9月7日...
use std : : comm;
let (port , chan) = comm : : stream( );
let chan = comm : : SharedChan : : new(chan);
do spawn | hoge | ...
use std : : comm;
let (port , chan) = comm : : stream( );
let chan = comm : : SharedChan : : new(chan);
do spawn | hoge | ...
Servoではどうなの?
servo/src/components/main/servo.rc
151行目らへん
13年9月7日土曜日
3. immutableなデータの共有
13年9月7日土曜日
Pipeを使ってもできる
13年9月7日土曜日
Pipeを使ってもできる
immutableなので
無駄なデータのコピー
13年9月7日土曜日
Auto Reference Counted wrapper
13年9月7日土曜日
extern mod extra;
use extra : : arc : :Arc;
let (port , chan) = stream( );
let pi = 3.14159;
let shared_num = Arc : : new(...
extern mod extra;
use extra : : arc : :Arc;
let (port , chan) = stream( );
let pi = 3.14159;
let shared_num = Arc : : new(...
http://saneyukis.hatenablog.com/entry/2013/07/28/233325
http://static.rust-lang.org/doc/tutorial-tasks.html
http://static....
4.タスクの失敗
13年9月7日土曜日
“exceptions in Rust are
unrecoverable within a single task:
once a task fails, there is no way to
"catch" the exception.”
...
タスクの例外は回復できない
13年9月7日土曜日
例外はfail!( )を呼ぶことで発生できる
13年9月7日土曜日
let result : Result<( ) , ( )> = do task : : try {
fail( );
};
assert!(result . is_err( ));
13年9月7日土曜日
基本的にタスクが死ぬと
関連するタスク全て死ぬ
13年9月7日土曜日
do spawn{
do spawn {
fail( );
}
hoge1( );
}
hoge2( );
13年9月7日土曜日
You’ve finished this document.
Download and read it offline.
Upcoming SlideShare
ジェネリクスの基礎と クラス設計への応用
Next
Upcoming SlideShare
ジェネリクスの基礎と クラス設計への応用
Next
Download to read offline and view in fullscreen.

Share

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

Download to read offline

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

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

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

    Oct. 18, 2014

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

Views

Total views

1,803

On Slideshare

0

From embeds

0

Number of embeds

32

Actions

Downloads

9

Shares

0

Comments

0

Likes

1

×