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

12,589 views
12,261 views

Published on

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

イベント駆動プログラミングと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. 参考文献

×