その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,277 views

Published on

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

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,277
On SlideShare
0
From Embeds
0
Number of Embeds
97
Actions
Shares
0
Downloads
4
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

その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. おしまい

×