rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド
TRANSCRIPT
![Page 2: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/2.jpg)
どーも
サイリウムです
![Page 3: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/3.jpg)
自己紹介:
名前:まかまか(略
所属:ネコトーストラボ
![Page 4: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/4.jpg)
![Page 5: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/5.jpg)
出典:http://free-designer.net/serach/entry.php?id=19151
![Page 6: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/6.jpg)
出典:http://bkuma.hatena.ne.jp/entry/iseebitarou.ldblog.jp/archives/24311566.html
![Page 7: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/7.jpg)
今日はこういう
「もう使われなくなる 懐かしいもの」
の話です。
![Page 8: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/8.jpg)
Perlの
ithreads(iスレッド)
![Page 9: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/9.jpg)
Perlではスレッドプログラミングをするためにithreadsがある(あった)
![Page 10: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/10.jpg)
スレッド……プロセスより軽いあれ
![Page 11: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/11.jpg)
usethreadオプションを
つけてPerlをコンパイル
![Page 12: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/12.jpg)
use threads;
threads->new( sub {
say 'Hello in ', threads->tid
} )->detach for 1 .. 10;
say 'Hello in ' , threads->tid; # メインスレッドtid=0
say 'end.';
![Page 13: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/13.jpg)
Hello in 1
Hello in 2
Hello in 3
Hello in 4
Hello in 5
Hello in 6
Hello in 7
Hello in 8
Hello in 0
end.
Hello in 10
Hello in 9
![Page 14: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/14.jpg)
Perl 5.20で
ithreadsの利用は
discouragedになった
![Page 15: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/15.jpg)
わが青春の愛スレッド
~さよなら哀スレッド
![Page 16: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/16.jpg)
![Page 17: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/17.jpg)
来歴
![Page 18: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/18.jpg)
元々はWindows版Perlでforkをエミュレートするためのもの(Win32 Thread)
それが逆輸入されpthreadで実装された
※5.5時代はThreadというモジュールがあった(5005threads)。
![Page 19: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/19.jpg)
動作原理
![Page 20: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/20.jpg)
threads->new(\&foo) するとpthread_createされて&fooを実行するperlインタプリタが生成される。
![Page 21: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/21.jpg)
threads->new(\&foo) するとpthread_createされて&fooを実行するperlインタプリタが生成される。
そして親スレッドの一切合財(シンボルテーブル、変数、ファイル)が子スレッドにコピーされる。
![Page 22: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/22.jpg)
threads->new(\&foo) するとpthread_createされて&fooを実行するperlインタプリタが生成される。
そして親スレッドの一切合財(シンボルテーブル、変数、ファイル)が子スレッドにコピーされる……
![Page 23: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/23.jpg)
my $hoge;
threads->create(sub{ })->detach;
# ↑スレッド内に$hogeはコピーされている!
![Page 24: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/24.jpg)
my $hoge;
threads->create(sub{ })->detach;
# ↑スレッド内に$hogeはコピーされている!
threads->create(sub{ })->detach;
# ↑こっちでも!
![Page 25: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/25.jpg)
大抵のスレッドの売り「軽い」
![Page 26: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/26.jpg)
大抵のスレッドの売り「軽い」
ithreads……「重い」
![Page 27: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/27.jpg)
大抵のスレッドの売り「軽い」
ithreads……「重い」
※メモリ的及び速度的に
![Page 28: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/28.jpg)
コーディングのコツ:
何もuseしてない、変数宣言してない段階で必要なだけ予めスレッドを生成しておくとよい!
![Page 29: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/29.jpg)
use threads;
my @threads;
push @threads, threads->new(\&foo) for 1..100;
# ここからくそ大量のモジュールをuseする
use DBIx::Class;
...
![Page 30: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/30.jpg)
変数値の共有動作原理
![Page 31: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/31.jpg)
変数は悉くコピーされるので、変数がスレッド間で共有されることはない
![Page 32: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/32.jpg)
use threads;
my $foo = 1;
my $thr = threads->new(sub { $foo++ });
$thr->join;
say $foo; # => 1
![Page 33: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/33.jpg)
そこで
threads::shared
![Page 34: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/34.jpg)
use threads;
use threads::shared;
my $foo : shared = 1;
my $thr = threads->new(sub { $foo++ });
$thr->join;
say $foo; # => 2
![Page 35: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/35.jpg)
use threads;
use threads::shared;
share($foo);
my $thr = threads->new(sub { $foo++ });
$thr->join;
say $foo; # => 2
![Page 36: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/36.jpg)
ちなみにblessされたオブジェクトがあれば子スレッドの数だけDESTROYが呼ばれるよ!
![Page 37: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/37.jpg)
use threads;
use threads::shared;
my $foo = bless {}, 'Foo';
my $thr = threads->new(sub {})->detach;
package Foo;
sub DESTROY {
say 'Destroy! ', threads->tid;
}
![Page 38: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/38.jpg)
Destroy! 0
Destroy! 1
![Page 39: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/39.jpg)
変数がスレッド間で共有されることがないので既存のコードも安心!
![Page 40: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/40.jpg)
変数がスレッド間で共有されることがないので既存のコードも安心! →PurePerlなら……
![Page 41: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/41.jpg)
XSモジュールについてはその限りではないので、スレッドセーフかどうかは一つひとつチェックしないと。
CLONEサブルーチン使う。
sub CLONE { }
![Page 42: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/42.jpg)
shareされた変数は裏ではtieされ、「共有変数用スレッド」にリンクされる。
![Page 43: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/43.jpg)
shareされた変数は裏ではtieされ、「共有変数用スレッド」にリンクされる。
STOREやFETCHを通じてデータがやり取りされる!
→遅い!
![Page 44: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/44.jpg)
共有変数用スレッドスレッドA スレッドB
$foo = 1
say $foo
$foo
![Page 45: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/45.jpg)
コンテキスト動作原理
![Page 46: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/46.jpg)
new (create) した時のコンテキストがjoin時のコンテキストになる。
![Page 47: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/47.jpg)
use threads;
my $th1 = threads->new( sub{return 1,3,5;} );
say $th1->join; # => 5
my ($th2) = threads->new( sub{return 1,3,5;} );
say $th2->join; # => 135
![Page 48: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/48.jpg)
ithreads
進化の過程
![Page 49: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/49.jpg)
初期の頃は
![Page 50: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/50.jpg)
threads->new
に失敗するといきなりperlごと死ぬ
![Page 51: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/51.jpg)
$thr->is_joinable
$thr->is_detached
$thr->is_running
などのメソッドがなかった
![Page 52: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/52.jpg)
スレッド用exitはない
子スレッド内でexitするとperlごとexitする
![Page 53: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/53.jpg)
その他昔の色々は下記サイトにhttp://www.donzoko.net/doc/memo/perlithreads.html
![Page 54: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/54.jpg)
![Page 55: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/55.jpg)
なぜか
みんなPurePerlで頑張った
Thread::State
![Page 56: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/56.jpg)
Thread::Running
![Page 57: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/57.jpg)
Thread::Running
threads::newを上書きしてスレッドを生成するときに共有クラス変数に状態を記録する
![Page 58: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/58.jpg)
Thread::Exit
![Page 59: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/59.jpg)
Thread::Exit
CORE::GLOBAL::exitを上書きしてごにょごにょ……
![Page 60: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/60.jpg)
Thread::State
![Page 61: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/61.jpg)
Thread::State
- XSモジュールis_joinable
is_joined
is_detached
wantarray
priority
![Page 62: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/62.jpg)
現在これらは
コアで実装されてます
![Page 63: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/63.jpg)
V1.09
スタックサイズの設定が可能に
スレッドIDが64bit整数に
![Page 64: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/64.jpg)
V1.27
$thr->killでシグナル可能に
![Page 65: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/65.jpg)
V1.33
exitで子スレッド終了
$thr->exit実装
![Page 66: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/66.jpg)
V1.34
->is_running, ->is_detached, ->is_joinable, ->wantarray
実装
![Page 67: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/67.jpg)
~ V2.02
この間、絶えずメモリリークとクラッシュを減じてきている
![Page 68: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/68.jpg)
ithreads
の天敵
![Page 69: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/69.jpg)
ithreads重くて不安定だよね……
![Page 70: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/70.jpg)
プロセスで
よいのでは?
![Page 71: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/71.jpg)
forks
![Page 72: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/72.jpg)
use forks;
threads->new( sub {
say 'Hello in ', threads->tid
} )->detach for 1 .. 10;
say 'Hello in ' , threads->tid; # メインスレッドtid=0
say 'end.';
![Page 73: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/73.jpg)
Marc Lehmann先生
![Page 74: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/74.jpg)
Marc Lehmann先生
Coro
![Page 75: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/75.jpg)
Marc Lehmann先生Unlike the so-called "Perl threads" ..., Coro provides a full shared address space, which makes communication between threads very easy. And coro threads are fast, too
![Page 76: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/76.jpg)
しかしCoroは
Perl 5.22で動かなくなった!
![Page 77: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/77.jpg)
ない
![Page 78: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/78.jpg)
ありがとうithreads
![Page 79: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/79.jpg)
さようならithreads
![Page 80: Rejectcon2015 わが青春の愛スレッド~さよなら哀スレッド](https://reader031.vdocuments.site/reader031/viewer/2022021419/58ed35601a28ab9f658b4609/html5/thumbnails/80.jpg)
わが青春の愛スレッド
~さよなら哀スレッド