Upload
Download free for 30 days
Login
Submit Search
マルチタスクって奥が深い #mishimapm
0 likes
8,303 views
鉄次 尾形
2014/7/12に行われた Mishima.pm#1 で発表したトークのスライドです。
Read more
1 of 35
Download now
Download to read offline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
More Related Content
PDF
CD-ROMドライブを身につけよう
Akira Ouchi
PDF
20151114 jawsug
司 知花
PDF
Making Editor written in Ruby version 20160611
Langur
PDF
Goodpatchに生息するbotたち
deepblue will
PPTX
新卒3年目のぼくが、でぶおぷす???なインフラおじさん方にAnsibleを導入してみた
Shuntaro Saiba
PDF
GUI何処行ったんDocker
Kazuhito Miura
PDF
20121126 Solr@ニコニコ生放送
Yoshimura Soichiro
PPTX
LT駆動開発08 - 無限のディスク領域を手に入れよう(妄想編)
Kazuya Matsubara
CD-ROMドライブを身につけよう
Akira Ouchi
20151114 jawsug
司 知花
Making Editor written in Ruby version 20160611
Langur
Goodpatchに生息するbotたち
deepblue will
新卒3年目のぼくが、でぶおぷす???なインフラおじさん方にAnsibleを導入してみた
Shuntaro Saiba
GUI何処行ったんDocker
Kazuhito Miura
20121126 Solr@ニコニコ生放送
Yoshimura Soichiro
LT駆動開発08 - 無限のディスク領域を手に入れよう(妄想編)
Kazuya Matsubara
What's hot
(16)
ODP
etckeeperをopenSUSEの公式リポジトリに入れたいぞ! Ver.2
Mitsutoshi Nakano
PDF
Goodby Hatena, hello Sphinx
Kouhei Maeda
PDF
JVM上で動くPython処理系実装のススメ
Yoshiaki Shibutani
PDF
ほんとはこわくない Gentoo Linux
gion_XY
PDF
Gentooサークル新歓コンパのご案内
Takuto Matsuu
PDF
俺のGentooがこんなに可愛いわけがない
Takuto Matsuu
PDF
Pythonが動く仕組み(の概要)
Yoshiaki Shibutani
PDF
Ubuntu なひととき
Hiroshi Chonan
PDF
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)
Kenichiro MATOHARA
ODP
Gentoo Linuxの紹介
University of Tsukuba Linux User Group
PDF
エンジニアのための痔の話
Kouhei Maeda
PPTX
HLSについて知っていることを話します
Moriyoshi Koizumi
PPTX
自動テスト入れてみたけど、誰からも反応が無かった話。
naoyuki miyata
PDF
今最もアツイdistribution Gentoo Linuxについて
Takuto Matsuu
PDF
S2s websrv201011-presen
Kouhei Maeda
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Yahoo!デベロッパーネットワーク
etckeeperをopenSUSEの公式リポジトリに入れたいぞ! Ver.2
Mitsutoshi Nakano
Goodby Hatena, hello Sphinx
Kouhei Maeda
JVM上で動くPython処理系実装のススメ
Yoshiaki Shibutani
ほんとはこわくない Gentoo Linux
gion_XY
Gentooサークル新歓コンパのご案内
Takuto Matsuu
俺のGentooがこんなに可愛いわけがない
Takuto Matsuu
Pythonが動く仕組み(の概要)
Yoshiaki Shibutani
Ubuntu なひととき
Hiroshi Chonan
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)
Kenichiro MATOHARA
Gentoo Linuxの紹介
University of Tsukuba Linux User Group
エンジニアのための痔の話
Kouhei Maeda
HLSについて知っていることを話します
Moriyoshi Koizumi
自動テスト入れてみたけど、誰からも反応が無かった話。
naoyuki miyata
今最もアツイdistribution Gentoo Linuxについて
Takuto Matsuu
S2s websrv201011-presen
Kouhei Maeda
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Yahoo!デベロッパーネットワーク
Ad
Viewers also liked
(8)
PDF
東京近郊のPerlコミュニティのご紹介 #lcs2015
鉄次 尾形
PDF
今に伝えるメールの技術 #yapcasia #yapcasiareject
鉄次 尾形
PDF
2014年には役に立たないセッションの昔話 #hachiojipm
鉄次 尾形
PDF
Mojolicious+redisでチャットを作った
Tetsuya Tatsumi
PDF
イベント駆動とノンブロッキング #hokkaidopm
鉄次 尾形
PPTX
Stream2の基本
shigeki_ohtsu
PDF
Joe Emison - 10X Product Development
ServerlessConf
PDF
DevOpsとか言う前にAWSエンジニアに知ってほしいアプリケーションのこと
Terui Masashi
東京近郊のPerlコミュニティのご紹介 #lcs2015
鉄次 尾形
今に伝えるメールの技術 #yapcasia #yapcasiareject
鉄次 尾形
2014年には役に立たないセッションの昔話 #hachiojipm
鉄次 尾形
Mojolicious+redisでチャットを作った
Tetsuya Tatsumi
イベント駆動とノンブロッキング #hokkaidopm
鉄次 尾形
Stream2の基本
shigeki_ohtsu
Joe Emison - 10X Product Development
ServerlessConf
DevOpsとか言う前にAWSエンジニアに知ってほしいアプリケーションのこと
Terui Masashi
Ad
Similar to マルチタスクって奥が深い #mishimapm
(15)
PPTX
Osoljp201204
Masataka Tsukamoto
PDF
初心者がOpenIndianaで自宅サーバを作ったよって話
Masataka Tsukamoto
PDF
プロセスの永続化でコスト削減 #perlbeginners
鉄次 尾形
PDF
チケット管理システム大決戦第二弾
Ryutaro YOSHIBA
PPTX
システムパフォーマンス勉強会#4
shingo suzuki
PPTX
システムパフォーマンス勉強会#4
shingo suzuki
PDF
Frequency with nltk
Atsushi Hayakawa
PPT
appengine活用事例資料@TDDBC札幌2.1
Go Sueyoshi (a.k.a sue445)
PPTX
Minio on Raspberry Pi
Masafumi Ohta
PDF
設定ファイルに使われそうなデータ形式
鉄次 尾形
ODP
etckeeperをopenSUSEの公式リポジトリに入れたいぞ!
Mitsutoshi Nakano
KEY
PerlのTwitterモジュールの紹介 #twtr_hack
鉄次 尾形
PDF
第六回 #渋谷java Javaを書き始めて 1年半が経って思うこと
Kazuhiro Serizawa
PDF
誰でも出来るosxでのローカルなウェブ開発環境構築
Hiroshi Yamato
PDF
MF GeeksNight pplogの話
Naoto Koshikawa
Osoljp201204
Masataka Tsukamoto
初心者がOpenIndianaで自宅サーバを作ったよって話
Masataka Tsukamoto
プロセスの永続化でコスト削減 #perlbeginners
鉄次 尾形
チケット管理システム大決戦第二弾
Ryutaro YOSHIBA
システムパフォーマンス勉強会#4
shingo suzuki
システムパフォーマンス勉強会#4
shingo suzuki
Frequency with nltk
Atsushi Hayakawa
appengine活用事例資料@TDDBC札幌2.1
Go Sueyoshi (a.k.a sue445)
Minio on Raspberry Pi
Masafumi Ohta
設定ファイルに使われそうなデータ形式
鉄次 尾形
etckeeperをopenSUSEの公式リポジトリに入れたいぞ!
Mitsutoshi Nakano
PerlのTwitterモジュールの紹介 #twtr_hack
鉄次 尾形
第六回 #渋谷java Javaを書き始めて 1年半が経って思うこと
Kazuhiro Serizawa
誰でも出来るosxでのローカルなウェブ開発環境構築
Hiroshi Yamato
MF GeeksNight pplogの話
Naoto Koshikawa
More from 鉄次 尾形
(20)
PDF
Perl入学式 2018年度の報告
鉄次 尾形
PDF
【公開版】AWS基礎 for 新卒エンジニア
鉄次 尾形
PDF
俺のこだわりデスクのその後
鉄次 尾形
PDF
Hokkaido.pmと7年
鉄次 尾形
PDF
WordPress 運用を支える Perl
鉄次 尾形
PDF
障害対応とその防止策
鉄次 尾形
PDF
働きやすい社内を目指す!二酸化炭素計測ツール
鉄次 尾形
PDF
Perl ウェブ開発の中世〜CGI と Plack の間〜
鉄次 尾形
PDF
コードの動的生成のお話
鉄次 尾形
PDF
三角関数の加法定理はなぜ難しいのか
鉄次 尾形
PDF
Perlで生きる10年
鉄次 尾形
PDF
穏やかにファイルを削除する続き
鉄次 尾形
PDF
日本全国ぶらりPerl旅
鉄次 尾形
PDF
穏やかにファイルを削除する
鉄次 尾形
PDF
最近のメールまわりのお仕事のお話
鉄次 尾形
PDF
再帰、漸化式、差分方程式とアルゴリズム Gx#20
鉄次 尾形
PDF
超小規模環境のMySQL #mysqlcasual
鉄次 尾形
PDF
mod_perlプログラマーがYAPCで語るレガシー開発論
鉄次 尾形
PDF
4月16日だからFoursquare 位置情報とライフログ
鉄次 尾形
PDF
ライフログ、時系列メモ
鉄次 尾形
Perl入学式 2018年度の報告
鉄次 尾形
【公開版】AWS基礎 for 新卒エンジニア
鉄次 尾形
俺のこだわりデスクのその後
鉄次 尾形
Hokkaido.pmと7年
鉄次 尾形
WordPress 運用を支える Perl
鉄次 尾形
障害対応とその防止策
鉄次 尾形
働きやすい社内を目指す!二酸化炭素計測ツール
鉄次 尾形
Perl ウェブ開発の中世〜CGI と Plack の間〜
鉄次 尾形
コードの動的生成のお話
鉄次 尾形
三角関数の加法定理はなぜ難しいのか
鉄次 尾形
Perlで生きる10年
鉄次 尾形
穏やかにファイルを削除する続き
鉄次 尾形
日本全国ぶらりPerl旅
鉄次 尾形
穏やかにファイルを削除する
鉄次 尾形
最近のメールまわりのお仕事のお話
鉄次 尾形
再帰、漸化式、差分方程式とアルゴリズム Gx#20
鉄次 尾形
超小規模環境のMySQL #mysqlcasual
鉄次 尾形
mod_perlプログラマーがYAPCで語るレガシー開発論
鉄次 尾形
4月16日だからFoursquare 位置情報とライフログ
鉄次 尾形
ライフログ、時系列メモ
鉄次 尾形
マルチタスクって奥が深い #mishimapm
1.
マルチタスクって奥が深い OGATA Tetsuji (@xtetsuji) 2014/07/12
Mishima.pm#1
2.
自己紹介 • 尾形 鉄次
(OGATA Tetsuji) • Twitter: @xtetsuji • Blog: http://post.tetsuji.jp/
3.
今回は無事に静岡に来られた!
4.
2013/12/11 Mishima.pm#0 2013年12月に胃潰瘍で入院したときのツイートまとめ - Togetterまとめ
http://togetter.com/li/607049
5.
あれから半年 • 半年経過後の胃カメラ検査をつい先日してきました • 静岡前の胃カメラ、今度は死亡フラグじゃなかった •
珍しい位置の潰瘍だったけど、なんとか生きてます • あれから毎月激動で、公私ともに忙しいけれど、皆様の 温かいご支援で生きています
6.
今だから復習したい マルチタスク
7.
過去にもマルチタスクの話は 結構しているけど成長が(ry
8.
過去にしているトークの一例 • 「そのsleep、ちょっと待った」(PerlBeginners#13) • 「イベント駆動とノンブロッキング」(Hokkaido.pm#10) •
今回はこれらのプラスアルファな感じの話をします • ビギナー向けにちょうどよい感じ、という言い訳 • みんなで質疑応答をしたりといった感じでよろしくです
9.
色々なPerlのツール • forkや、Parallel::ForkManager、Parallel::Prefork など •
封印されしithreads (アッ、誰か来た) • AnyEvent前史のPOEフレームワーク • AnyEvent、そしてCoroといったMarc Lehmmanツール • 今昔IO非同期系ツール群
10.
結構雑にカジュアルに • マルチタスク=複数の仕事をこなす • 非同期=ノンブロッキング •
同期=ブロッキング • 情報系の学術論文でないのであれば、この辺りあんまり 厳密に区別しなくてもよいっぽい(頭の中でできることに 越した事はありません)
11.
ithreadsが使われない理由 • Perlのスレッド(ithreads)は不安定だし効率が悪い • Perlはグローバルな状態だらけの世界観なので、後付け のスレッドもインタープリタプールを作ったり、色々大 変な事をしているので、同情してあげてください •
Windowsにはforkがないので、WindowsのPerlでは Win32スレッドを使ったforkのエミューレーションをし ているそうです
12.
forkモデル • fork=フォーク=分岐 • 途中で親と子に分かれてプログラムの分岐を行う •
Perl組み込みのfork関数がそれを実現してくれる
13.
forkサンプル #!/usr/bin/env perl! ! use strict;! use
warnings;! use utf8;! ! binmode STDOUT, ':utf8';! binmode STDERR, ':utf8';! ! print "親です。プロセスIDは $$ です。開始します。n";! ! my $pid = fork; # ここで親と子で分岐! ! if ( $pid ) {! sleep 2;! print "親です。子のプロセスIDは $pid のようです。しばらく休みますn";! sleep 10;! print "親です。10秒待ちました。n";! } elsif ( $pid == 0 ) {! sleep 3;! print "子です。私のプロセスIDは $$ のようです。n";! for my $i (1..5) {! print "子です。${i}回目。n";! sleep 1;! }! print "子はしばらく待ちます。先に親が終了してプロンプトに戻りますn";! sleep 10;! } else {! die "forkできなかった?n";! }! ! print "pid=$pid $$=$$n"; # 親も子も通る
14.
あんまりforkを直接書かない • 見てパッと理解できない • 多くの子プロセスを作るときにfork()を呼びまくった ら結構混乱する •
親と子でコミュニケーションするにはプロセス間通信が 一番プリミティブな方法かな • 多くのforkが必要になった場合には、これを抽象化した Parallel::ForkManagerが役に立つ
15.
Parallel::ForkManagerの例 #!/usr/bin/env perl! ! use strict;! use
warnings;! ! use LWP::UserAgent;! use Parallel::ForkManager;! ! my @urls = ( map { sprintf "http://example.jp/images/%02d.jpg" } (1..99) );! ! my $ua = LWP::UserAgent->new;! ! my $pm = Parallel::ForkManager->new(5); # 最大5プロセス並列! ! for my $url (@urls) {! my $pid = $pm->start and next;! # 子プロセスの処理! print "プロセスIDが $$ の子プロセスが $url からデータをダウンロードしますn";! ( my $filename = $url ) =~ s{.*/}{};! $ua->get($url, ":content_file" => $filename);! $pm->finish; # 子プロセスを終了! }
16.
並列ダウンロードと マルチタスク • 外界の影響を受けるダウンロードというタスクの場合、 同期的にダウンロードをするとサーバによって待たされ るケースがあったりする • RSSとかを大量にクロールするとか、死活問題 •
例えばParallel::ForkManagerで解決できる
17.
ForkManagerとPrefork • Parallel::ForkManagerは並列クライアントを作るもの、 Parallel::Preforkは並列処理ができるforkモデルのサーバ を作るものと覚えておくとよい • Parallel::ForkManagerは相当以前からDebian/Ubuntu パッケージとしても提供されているので、システムPerl でも使いやすい •
Parallel::Preforkは奥一穂さんによる和製モジュール
18.
forkの問題点と言われること • プログラムのコピーなのでメモリを食う • Copy
on Write(CoW)というOSの機構により倍々には ならないはずだけど、限界はある • プロセス間通信が面倒 • これは頑張るか、コストを気にしなければHTTP等の サーバを介したりするのがよいかも
19.
とはいえforkはよく使う • UNIX/Linuxのサブプロセスの原点fork • 覚えておくと色々勉強になるし、自分もよく勉強してる •
Perlのsystem関数はforkとexecの組み合わせ • 先輩プログラマが「フォーク」とか言っているときに、 ちょっと知った気になれるの重要
20.
イベント駆動モデル • スレッドともforkとも若干違うマルチタスクモデル • Apacheのprefork
MPMがAjax時代にまつわるC10K問題 に対抗できない代替として生まれたともいえるNginxの マルチタスクモデルとして注目された • Perlでは、AnyEventというイベント駆動フレームワーク が以前から主流で、以前からあった同種のイベント駆動 モジュールのインターフェースを統一したりもした
21.
AnyEvent • 以前流行したPOEの後継にあたるものともいえる • Perlで動作する様々なイベント駆動フレームワークの、 今の事実上のデファクトスタンダード •
裏側のイベント処理実装に様々なものが選べる • 各種イベント(時間、I/O、シグナル、などなど)で処理を 走らせることができる
22.
AnyEventの後ろの実装 • AnyEvent::Impl::* 以下にあるものが選べる •
Cocoa、Event、FLTK、IOAsync、POE、Qt、EV、 EventLib、Glib、Irssi、Perl (AnyEvent標準の実装)、Tk • 通常はAnyEvent::Impl::Perlが選ばれるけど、EVを選ん だり、場所によって選択を変える場合がある • Marc Lehmann氏も「POEはやめとけ」と書いている
23.
POEが衰退した理由 • 構造が複雑:OSとほぼ同じ、カーネル・ヒープ構造 • 書き方が複雑 •
静かにプログラムが異常終了していることが多かった • 重いとも言われていた
24.
daemonを作るwhileループ • daemon的な常駐プログラムを作る場合、 while(1){…} といった無限ループを作ることが定石 •
とはいえ、無限ループにsleepをはさみ忘れたりすると、 CPU暴走してサーバが死んだりするので怖い • while無限ループはなるべく自前で書かない方がいいとい うのが私の持論
25.
AnyEventの方法論 • AnyEvent::Impl::* によっても変わるけど、結局的に、 PerlやCのwhile(1){…}が一番根底で走っていると思っ て差し支えない •
特にAnyEvent::Impl::Perlの場合は、AnyEvent::Loopが それらしい
26.
AnyEvent::Loopより sub run {! one_event
while 1;! } one_event メソッドは多くの仕事をしていますが割愛
27.
AnyEventの活用例 • クライアントでは各種IRCやTwitterボットなどで活用 • サーバではWebサーバ(Twiggyが有名)をはじめとした、 任意のTCPサーバが書ける •
これらを組み合わせたりできるので、IRCクライアント でかつWebサーバというプログラムも書ける (Ikachanと いう良い実装例もある)
28.
AnyEventで時間イベント #!/usr/bin/env perl! ! use strict;! use
warnings;! use AnyEvent;! ! my $cv = AnyEvent->condvar; # 状態変数! my $timer1 = AnyEvent->timer(! after => 1,! cb => sub { print "timer1 hello!n"; },! interval => 2,! );! my $timer2 = AnyEvent->timer(! after => 1,! cb => sub { print "timer2 hello!n"; },! interval => 3,! );! my $timer3 = AnyEvent->timer(! after => 1,! cb => sub { print "timer3 hello!n"; },! interval => 5,! );! my $stop_timer = AnyEvent->timer(! after => 10,! cb => sub { $cv->send("end"); }, # 終わらせる! );! my $val = $cv->recv; # ループをまわす! print "terminate: $valn";
29.
AnyEventで時間イベント • 最初はwhileループのほうが良いと思うけど、自分で気を つけてsleep書かなくてもいいし慣れるとこっちが良い • IRCボットとかだと、定時発言などもこれでできる •
perldoc AnyEventをみたり、CPANでAnyEventで作られ たモジュールを見たりして少しずつ覚えていくといい
30.
AnyEvent::Mac::Pasteboard • Macのクリップボード(ペーストボード)を監視して、変更 があったら指定の処理をするモジュールを書いてみた • これもタイマーで変更を定期監視しているだけ •
Cocoaの知識があればもっと良い感じができるかも • その後AnyEvent::Clipboardも作りました(GitHub止まり)
31.
その他 • CPANで「Async」というキーワードで検索してみる • AnyEventを入れるほどではないけど、非同期アクセスが 必要な場合に良い場合がある
(HTTP::Asyncとか) • MojoliciousであればMojo::IOLoopとか • Mojolicious飲み会とかやりたいと思っているので、続き はそこで非同期飲み会やりましょう
32.
注意点とか • LWP::UserAgent等で長時間処理をブロックしたりする と、AnyEventの処理全体をブロックすることになるので ノンブロッキングなAnyEvent::HTTPなどを使おう • JavaScriptのAjaxやっている人だとコールバック的 •
ドヤ顔で「AnyEventで(ry」とか言ってIO::Socket::INET 使っていたりすると、ブロッキングとか言われて恥ずか しい思いをします
33.
最後にいろいろ • ノンブロッキングのネットワークI/Oについては AnyEvent::Socketをベースに作ります • AnyEvent::SocketはSocketモジュールをベースに、ノン ブロッキングネットワークI/Oの方法論を元に書かれてい るようです •
基本的に、既に作られているL7層のモジュールを元に、 自分で新しいプログラムやモジュールを作ればしあわせ
34.
全然掘り起こせなかったですが 奥が深いので続きはどこかで
35.
おしまい
Download