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.
そのsleep、ちょっと待った!
OGATA Tetsuji (@xtetsuji)
2014/05/23 PerlBeginners#13
自己紹介
• 尾形 鉄次 (OGATA Tetsuji)
• Twitter: @xtetsuji
• Blog: http://post.tetsuji.jp/
sleep
通院スペシャリスト
• 昨年12月に胃潰瘍で入院、1月に風邪とインフルエンザ
• 今も入院していた消化器外科に通院しているのですが、
ここ最近は咳も止まらなくて呼吸器内科にも通い始めた
• 結果、薬が増えまくった
テーマをsleepにした理由
• 呼吸器内科の薬の副作用だと思うけど、眠くて困る
• 今回のPBも最初は発表者がいなくて「じゃあ僕も何か
しゃべりますよ」って言ったけど、テーマを考えている
最中も眠くて参った
• というわけでテーマをsleep...
最初のsleep体験
• (高校時代のMSX BASICのことはもう記憶に無いなぁ)
• 大学一年生の時のC言語の授業
• なんか「ちょっと待ってから出力」したいというときに
こういうコードを例示された覚えがある
最初のsleep体験
#include <stdio.h>!
!
int main (void) {!
int i;!
printf("こんにちは!n");!
for(i=0;i<1000000000;i++) {}!
printf("待った?...
CPU温めsleep
• for文で無駄な計算をさせて、処理を遅らせるハック!?
• CPUが暖まって冬に嬉しい、夏に厳しい
• 賢いコンパイラには最適化されて無意味になるはず
• POSIX系OSであればunistd.hにsleep関数ありま...
Perlのsleep
• Perlにはsleepという関数が標準関数で存在する!
• sleepし放題
• だけど、あまりsleepしてはダメな時がある
• ウェブサーバのような即時応答が基本なもの
• イベント駆動サーバのように他の処理をブロ...
同期とかブロッキングとか
• sleepのように、同じプロセス上で同時並行で走ってい
るかもしれない他の処理を阻害する処理のことを「同期」
処理とか「ブロッキング」処理とかいいます
• 対義語は「非同期」「ノンブロッキング」
• 同期・非同期と...
Webサーバでちょっと待ちたい
• sleepとか書くと、ワーカーの同時処理を阻害する
• Mojoliciousのhypnotoadでは標準でワーカーは4しかい
ないので、長時間ブロックする処理が4連続続いたら、
しばらくはWebサーバが無反...
そもそもなぜ待ちたいのか
• ユーザに遅延してデータを送りたいってケース、まれに
あるかもしれないけど、よくよく考えると別レイヤーで
やった方が良いケースがある(ブラウザ上のJavaScript等)
• JavaScriptは非同期前提の世界な...
API制限とか
• 単位時間あたりのAPIリクエスト数に制限があるから
sleepするとかってケース(外部に気を使うケース)
• AnyEventなどのイベント駆動サーバ上で動いているもの
の場合はsleepって書くと他の部分を止めることになる...
逆に同時並行アクセスとか
• 逆に一度のHTTPリクエストに対して、何度もLWPを
使って外へHTTPアクセスする必要がある場合、LWPの
多用自体が無視できないブロッキングになる場合がある
• RSSとかのクローラみたいなやつ
• HTTP:...
余談:JavaScriptでは
• 非同期前提のJavaScriptの世界ではsleepは無い
• 最初のfor文のようなユーザのCPUを温めるコードを書い
たらマジでクレームもの
• setTimeoutなどを利用したり、HTTPアクセスでは...
書き捨てならOKだよ
• もちろん、書き捨てスクリプトならsleepでもよいよね
• 「仕方なく一瞬待つ」場合はTime::HiResで可能な限り
影響を少なくする
• 今日はトークレベルや時間の都合で、結構端折っちゃっ
たけど、サーバのライフ...
そのsleep、ちょっと待った!
→待ち方が問われる場合アリ!
眠くなってきたので
このへんで、おやすみなさい😪
おしまい
そのsleep、ちょっと待った! #perlbeginners
Upcoming SlideShare
Loading in …5
×

そのsleep、ちょっと待った! #perlbeginners

4,527 views

Published on

2014/5/23に行われた PerlBeginners#13 で発表したLTのスライドです。

Published in: Technology
  • Be the first to comment

そのsleep、ちょっと待った! #perlbeginners

  1. 1. そのsleep、ちょっと待った! OGATA Tetsuji (@xtetsuji) 2014/05/23 PerlBeginners#13
  2. 2. 自己紹介 • 尾形 鉄次 (OGATA Tetsuji) • Twitter: @xtetsuji • Blog: http://post.tetsuji.jp/
  3. 3. sleep
  4. 4. 通院スペシャリスト • 昨年12月に胃潰瘍で入院、1月に風邪とインフルエンザ • 今も入院していた消化器外科に通院しているのですが、 ここ最近は咳も止まらなくて呼吸器内科にも通い始めた • 結果、薬が増えまくった
  5. 5. テーマをsleepにした理由 • 呼吸器内科の薬の副作用だと思うけど、眠くて困る • 今回のPBも最初は発表者がいなくて「じゃあ僕も何か しゃべりますよ」って言ったけど、テーマを考えている 最中も眠くて参った • というわけでテーマをsleepにしました
  6. 6. 最初のsleep体験 • (高校時代のMSX BASICのことはもう記憶に無いなぁ) • 大学一年生の時のC言語の授業 • なんか「ちょっと待ってから出力」したいというときに こういうコードを例示された覚えがある
  7. 7. 最初のsleep体験 #include <stdio.h>! ! int main (void) {! int i;! printf("こんにちは!n");! for(i=0;i<1000000000;i++) {}! printf("待った?n");! return(1);! }!
  8. 8. CPU温めsleep • for文で無駄な計算をさせて、処理を遅らせるハック!? • CPUが暖まって冬に嬉しい、夏に厳しい • 賢いコンパイラには最適化されて無意味になるはず • POSIX系OSであればunistd.hにsleep関数あります • こういう悪手、JavaScriptで「待ちたい」というときに 似たような手法やる人いそうでヤバイときがある
  9. 9. Perlのsleep • Perlにはsleepという関数が標準関数で存在する! • sleepし放題 • だけど、あまりsleepしてはダメな時がある • ウェブサーバのような即時応答が基本なもの • イベント駆動サーバのように他の処理をブロックして はいけないもの、などなど…
  10. 10. 同期とかブロッキングとか • sleepのように、同じプロセス上で同時並行で走ってい るかもしれない他の処理を阻害する処理のことを「同期」 処理とか「ブロッキング」処理とかいいます • 対義語は「非同期」「ノンブロッキング」 • 同期・非同期とブロッキング・ノンブロッキングの違い はここではあまり厳密に区別しません
  11. 11. Webサーバでちょっと待ちたい • sleepとか書くと、ワーカーの同時処理を阻害する • Mojoliciousのhypnotoadでは標準でワーカーは4しかい ないので、長時間ブロックする処理が4連続続いたら、 しばらくはWebサーバが無反応になる • Plackで使われるStarmanやStarletもだいたい同じ • 待ちたい場合には別の書き方をする
  12. 12. そもそもなぜ待ちたいのか • ユーザに遅延してデータを送りたいってケース、まれに あるかもしれないけど、よくよく考えると別レイヤーで やった方が良いケースがある(ブラウザ上のJavaScript等) • JavaScriptは非同期前提の世界なので、そういう考え方 が鍛えられます
  13. 13. API制限とか • 単位時間あたりのAPIリクエスト数に制限があるから sleepするとかってケース(外部に気を使うケース) • AnyEventなどのイベント駆動サーバ上で動いているもの の場合はsleepって書くと他の部分を止めることになる ので禁じ手だし、LWPだってブロッキング処理だって、 神経質な人に言われるかも (AnyEvent::HTTP使う等する) • 戦場に備えてsleepしない書き方を覚えておくと良い
  14. 14. 逆に同時並行アクセスとか • 逆に一度のHTTPリクエストに対して、何度もLWPを 使って外へHTTPアクセスする必要がある場合、LWPの 多用自体が無視できないブロッキングになる場合がある • RSSとかのクローラみたいなやつ • HTTP::Async とか “Parallel HTTP” で検索して出てくる CPANモジュールを使うと同時並行アクセスができる事 を覚えておくと、いざというときに役に立つ
  15. 15. 余談:JavaScriptでは • 非同期前提のJavaScriptの世界ではsleepは無い • 最初のfor文のようなユーザのCPUを温めるコードを書い たらマジでクレームもの • setTimeoutなどを利用したり、HTTPアクセスではAjax の非同期モードを使うのが前提 • 順序を気にする場合にはDeferredとかで検索してみよう
  16. 16. 書き捨てならOKだよ • もちろん、書き捨てスクリプトならsleepでもよいよね • 「仕方なく一瞬待つ」場合はTime::HiResで可能な限り 影響を少なくする • 今日はトークレベルや時間の都合で、結構端折っちゃっ たけど、サーバのライフサイクルとか興味のある人は、 他の書籍や勉強会で調べてみるといいですよ
  17. 17. そのsleep、ちょっと待った! →待ち方が問われる場合アリ!
  18. 18. 眠くなってきたので このへんで、おやすみなさい😪
  19. 19. おしまい

×