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

  • 8,616 views
Uploaded on

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

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

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
8,616
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
45
Comments
0
Likes
31

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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