イベント駆動プログラミン       グと    I/O多重化
イベント駆動プログラミング
イベントを待機し、起こったイベントに従って処理を行うプログラミングパラダ     イム
フロー駆動型プログラミングと呼ばれる従来のプログラミングパラダイムに対す     る概念
GUIプログラミング
キーやマウスの入力をイベントとして受け取って処理
ネットワークプログラミ     ング
ネットワークI/Oを多重化して1プロセス1スレッドで複数のネットワーク接続を同時に捌       く
非イベント駆動なネットワークプログラミング           processClient       or           thread           processClient       or           thread ...
イベント駆動なネットワークプログラミングClient           processClient       or           threadClient
今回はこっちがメイ    ン
The C10K Problem
イベント駆動型プログラミングの処理フ    ロー
element.addEventListener(   ’click’,   function(){ console.log(‘hoge’) },   true);
これってどう動いてる    の?
イベントループ(メインループ)
イベント登録イベント待ちイベント処理 後処理
高レベルな言語ではイベントループを自分で  書く必要はない
element.addEventListener(   ’click’,   function(){ console.log(‘hoge’) },   true);
後で自分で書くとどうなるか解説します
イベントの種類
タイマー
I/O
シグナル
子プロセス
イベント登録イベント待ちイベント処理 後処理
イベントループの話   おしまい
I/O多重化
ネットワークプログラミングにおけるイベント駆    動の要
これなくして1プロセス1スレッドで複数のネットワーク接続を同時捌くことはで     きない
なぜ1プロセス1スレッドで捌く必要があるの     か?
The C10K Problem    でググれ
I/O多重化の仕組み
I/Oイベント登    録I/Oイベント待    ちI/Oイベント処    理  後処理
非同期echoサーバを題材にサンプルコードで見       る
多重化してない例
int sock = socket(PF_INET, SOCK_STREAM);bind(sock, addr);listen(sock);while ( 1 ) {  int new_sock = accept(sock, &addr);  ...
多重化での処理の流れ
クライアント 待ち受けソケット(イベント監視対象    サーバ  につっこむ)
クライアント 待ち受けソケット(イベント監視対象)    サーバ
クライアント                    accept(sock) 待ち受けソケット                  接続ソケット(イベント監視対象)    サーバ                           (イベント監視...
クライアント 待ち受けソケット              接続ソケット(イベント監視対象)    サーバ                      (イベント監視対                         象)
selectによる多重化
https://gist.github.com/mizzy/5343931
epollによる多重化
https://gist.github.com/mizzy/5343937
多重化用関数
select   poll  epoll kqueue/dev/poll
select/pollは全部のソケットを調べる
epoll, kqueue, /dev/pollはイベントが発生したソケットだけを調べることができる
イベントライブラリ
libevent  libev
OSによる違いを吸収   してくれる
I/O多重化以外にもタイマーイベントやシグナルイベントなんかも扱える
node.jsはlibevent + libeio
各種言語による非同期echoサーバ
Perl(AnyEvent)
https://gist.github.com/mizzy/5343944
Ruby(EventMachine)
https://gist.github.com/mizzy/5343953
Python(twisted)
https://gist.github.com/mizzy/5343956
Python(eventlet)
https://gist.github.com/mizzy/5343959
node.js
https://gist.github.com/mizzy/5343964
イベント駆動プログラミン   グのデメリット
マルチコアでスケールしな      い
処理の流れが追いにくい   書きにくい
var req_to_zenrin = http.request(   options,   function(res2) {     res2.on(end, function() {         res.end();     });  ...
var referer;sdb.getItem(   gha,   host,   function( error, result ) {     if ( result ) {        referer = ‘http://hoge.co...
sdb.getItem(   gha,   host,   function( error, result ) {     if ( result ) {        access_to_zenrin(http://hoge.com);   ...
ネットワークアクセスを伴      う 処理をすべて非同期で  書かないといけない
なのでlibmysqlclientは   使えない
node-mysqlはlibmysqlclient相当の処理を再実装してる      (っぽい)
参考文献
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
Upcoming SlideShare
Loading in...5
×

イベント駆動プログラミングとI/O多重化

10,406

Published on

2年ぐらい前の社内勉強会で使った資料。

0 Comments
45 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
10,406
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
54
Comments
0
Likes
45
Embeds 0
No embeds

No notes for slide

イベント駆動プログラミングとI/O多重化

  1. 1. イベント駆動プログラミン グと I/O多重化
  2. 2. イベント駆動プログラミング
  3. 3. イベントを待機し、起こったイベントに従って処理を行うプログラミングパラダ イム
  4. 4. フロー駆動型プログラミングと呼ばれる従来のプログラミングパラダイムに対す る概念
  5. 5. GUIプログラミング
  6. 6. キーやマウスの入力をイベントとして受け取って処理
  7. 7. ネットワークプログラミ ング
  8. 8. ネットワークI/Oを多重化して1プロセス1スレッドで複数のネットワーク接続を同時に捌 く
  9. 9. 非イベント駆動なネットワークプログラミング processClient or thread processClient or thread processClient or thread
  10. 10. イベント駆動なネットワークプログラミングClient processClient or threadClient
  11. 11. 今回はこっちがメイ ン
  12. 12. The C10K Problem
  13. 13. イベント駆動型プログラミングの処理フ ロー
  14. 14. element.addEventListener( ’click’, function(){ console.log(‘hoge’) }, true);
  15. 15. これってどう動いてる の?
  16. 16. イベントループ(メインループ)
  17. 17. イベント登録イベント待ちイベント処理 後処理
  18. 18. 高レベルな言語ではイベントループを自分で 書く必要はない
  19. 19. element.addEventListener( ’click’, function(){ console.log(‘hoge’) }, true);
  20. 20. 後で自分で書くとどうなるか解説します
  21. 21. イベントの種類
  22. 22. タイマー
  23. 23. I/O
  24. 24. シグナル
  25. 25. 子プロセス
  26. 26. イベント登録イベント待ちイベント処理 後処理
  27. 27. イベントループの話 おしまい
  28. 28. I/O多重化
  29. 29. ネットワークプログラミングにおけるイベント駆 動の要
  30. 30. これなくして1プロセス1スレッドで複数のネットワーク接続を同時捌くことはで きない
  31. 31. なぜ1プロセス1スレッドで捌く必要があるの か?
  32. 32. The C10K Problem でググれ
  33. 33. I/O多重化の仕組み
  34. 34. I/Oイベント登 録I/Oイベント待 ちI/Oイベント処 理 後処理
  35. 35. 非同期echoサーバを題材にサンプルコードで見 る
  36. 36. 多重化してない例
  37. 37. int sock = socket(PF_INET, SOCK_STREAM);bind(sock, addr);listen(sock);while ( 1 ) { int new_sock = accept(sock, &addr); char buf[100]; size_t size = read(new_sock, buf, 100); if ( size == 0 ) { close(new_sock); } else { write(new_sock, buf, size); }}
  38. 38. 多重化での処理の流れ
  39. 39. クライアント 待ち受けソケット(イベント監視対象 サーバ につっこむ)
  40. 40. クライアント 待ち受けソケット(イベント監視対象) サーバ
  41. 41. クライアント accept(sock) 待ち受けソケット 接続ソケット(イベント監視対象) サーバ (イベント監視 対象につっこ む)
  42. 42. クライアント 待ち受けソケット 接続ソケット(イベント監視対象) サーバ (イベント監視対 象)
  43. 43. selectによる多重化
  44. 44. https://gist.github.com/mizzy/5343931
  45. 45. epollによる多重化
  46. 46. https://gist.github.com/mizzy/5343937
  47. 47. 多重化用関数
  48. 48. select poll epoll kqueue/dev/poll
  49. 49. select/pollは全部のソケットを調べる
  50. 50. epoll, kqueue, /dev/pollはイベントが発生したソケットだけを調べることができる
  51. 51. イベントライブラリ
  52. 52. libevent libev
  53. 53. OSによる違いを吸収 してくれる
  54. 54. I/O多重化以外にもタイマーイベントやシグナルイベントなんかも扱える
  55. 55. node.jsはlibevent + libeio
  56. 56. 各種言語による非同期echoサーバ
  57. 57. Perl(AnyEvent)
  58. 58. https://gist.github.com/mizzy/5343944
  59. 59. Ruby(EventMachine)
  60. 60. https://gist.github.com/mizzy/5343953
  61. 61. Python(twisted)
  62. 62. https://gist.github.com/mizzy/5343956
  63. 63. Python(eventlet)
  64. 64. https://gist.github.com/mizzy/5343959
  65. 65. node.js
  66. 66. https://gist.github.com/mizzy/5343964
  67. 67. イベント駆動プログラミン グのデメリット
  68. 68. マルチコアでスケールしな い
  69. 69. 処理の流れが追いにくい 書きにくい
  70. 70. var req_to_zenrin = http.request( options, function(res2) { res2.on(end, function() { res.end(); }); res2.on(data, function(chunk) { res.write(chunk); }); });
  71. 71. var referer;sdb.getItem( gha, host, function( error, result ) { if ( result ) { referer = ‘http://hoge.com/’; } });// sdb.getItem()終了前に次の処理
  72. 72. sdb.getItem( gha, host, function( error, result ) { if ( result ) { access_to_zenrin(http://hoge.com); } else { access_to_zenrin(); } });
  73. 73. ネットワークアクセスを伴 う 処理をすべて非同期で 書かないといけない
  74. 74. なのでlibmysqlclientは 使えない
  75. 75. node-mysqlはlibmysqlclient相当の処理を再実装してる (っぽい)
  76. 76. 参考文献
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×