SlideShare a Scribd company logo
イベント駆動プログラミン
       グと
    I/O多重化
イベント駆動プログラミング
イベントを待機し、起こっ
たイベントに従って処理を
行うプログラミングパラダ
     イム
フロー駆動型プログラミン
グと呼ばれる従来のプログ
ラミングパラダイムに対す
     る概念
GUIプログラミング
キーやマウスの入力をイベ
ントとして受け取って処理
ネットワークプログラミ
     ング
ネットワークI/Oを多重化して
1プロセス1スレッドで複数の
ネットワーク接続を同時に捌
       く
非イベント駆動な
ネットワークプログラミング
           process
Client       or
           thread


           process
Client       or
           thread


           process
Client       or
           thread
イベント駆動な
ネットワークプログラミング

Client


           process
Client       or
           thread



Client
今回はこっちがメイ
    ン
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);
  char buf[100];
  size_t size = read(new_sock, buf, 100);
  if ( size == 0 ) {
      close(new_sock);
  }
  else {
      write(new_sock, buf, size);
  }
}
多重化での処理の流れ
クライアント




 待ち受けソケット
(イベント監視対象    サーバ
  につっこむ)
クライアント




 待ち受けソケット
(イベント監視対象)    サーバ
クライアント




                    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();
     });
     res2.on('data', function(chunk) {
         res.write(chunk);
     });
   }
);
var referer;
sdb.getItem(
   'gha',
   host,
   function( error, result ) {
     if ( result ) {
        referer = ‘http://hoge.com/’;
      }
   }
);

// sdb.getItem()終了前に次の処理
sdb.getItem(
   'gha',
   host,
   function( error, result ) {
     if ( result ) {
        access_to_zenrin('http://hoge.com');
      }
     else {
        access_to_zenrin();
     }
   }
);
ネットワークアクセスを伴
      う
 処理をすべて非同期で
  書かないといけない
なのでlibmysqlclientは
   使えない
node-mysqlはlibmysqlclient
相当の処理を再実装してる
      (っぽい)
参考文献
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化

More Related Content

PDF
リッチなドメインモデル 名前探し
増田 亨
 
PDF
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
 
PDF
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop
 
PDF
関数型プログラミングのデザインパターンひとめぐり
Kazuyuki TAKASE
 
PDF
ドメイン駆動設計に15年取り組んでわかったこと
増田 亨
 
PDF
オンラインゲームの仕組みと工夫
Yuta Imai
 
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
PDF
怖くないSpring Bootのオートコンフィグレーション
土岐 孝平
 
リッチなドメインモデル 名前探し
増田 亨
 
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop
 
関数型プログラミングのデザインパターンひとめぐり
Kazuyuki TAKASE
 
ドメイン駆動設計に15年取り組んでわかったこと
増田 亨
 
オンラインゲームの仕組みと工夫
Yuta Imai
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
怖くないSpring Bootのオートコンフィグレーション
土岐 孝平
 

What's hot (20)

PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
 
PDF
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
 
PDF
できる!並列・並行プログラミング
Preferred Networks
 
PDF
Javaのログ出力: 道具と考え方
Taku Miyakawa
 
PPTX
さくっと理解するSpring bootの仕組み
Takeshi Ogawa
 
PPTX
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQLアンチパターン
Soudai Sone
 
PDF
暗号技術の実装と数学
MITSUNARI Shigeo
 
PPTX
イベント・ソーシングを知る
Shuhei Fujita
 
PDF
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
 
PDF
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
 
PDF
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
PDF
ドメインオブジェクトの見つけ方・作り方・育て方
増田 亨
 
PDF
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Shin Ohno
 
PDF
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
 
PDF
君はyarn.lockをコミットしているか?
Teppei Sato
 
PDF
インフラエンジニアの綺麗で優しい手順書の書き方
Shohei Koyama
 
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
 
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
 
できる!並列・並行プログラミング
Preferred Networks
 
Javaのログ出力: 道具と考え方
Taku Miyakawa
 
さくっと理解するSpring bootの仕組み
Takeshi Ogawa
 
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
PostgreSQLアンチパターン
Soudai Sone
 
暗号技術の実装と数学
MITSUNARI Shigeo
 
イベント・ソーシングを知る
Shuhei Fujita
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
 
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
 
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
ドメインオブジェクトの見つけ方・作り方・育て方
増田 亨
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Shin Ohno
 
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
 
君はyarn.lockをコミットしているか?
Teppei Sato
 
インフラエンジニアの綺麗で優しい手順書の書き方
Shohei Koyama
 
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
 
Ad

Similar to イベント駆動プログラミングとI/O多重化 (20)

PDF
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
ThinReports
 
PDF
Node.jsでブラウザメッセンジャー
Yahoo!デベロッパーネットワーク
 
PDF
アドテク×Scala×パフォーマンスチューニング
Yosuke Mizutani
 
PDF
【Unity道場京都スペシャル4】Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
UnityTechnologiesJapan002
 
PDF
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Yoshifumi Kawai
 
PDF
Ajax 応用
Katsuyuki Seino
 
PPTX
NAO/Pepper 開発環境 について
Takuji Kawata
 
PDF
Serfが面白いと俺の中で話題にwwwwww
Masahito Zembutsu
 
PDF
Chrome DevTools.next
yoshikawa_t
 
PDF
How To Drink Wsgi
Atsushi Odagiri
 
PDF
Apache geode at-s1p
Masaki Yamakawa
 
PDF
Node予備校 vol.1 名古屋
Mori Shingo
 
PDF
Windows 8時代のUXを支える非同期プログラミング
Yuya Yamaki
 
PPTX
C#の書き方
信之 岩永
 
PPTX
C#の書き方
信之 岩永
 
PDF
20130315 abc firefox_os
Tomoaki Konno
 
PPTX
HTML5&API総まくり
Shumpei Shiraishi
 
ODP
Programming camp Codereading
Hiro Yoshioka
 
PDF
Serf / Consul 入門 ~仕事を楽しくしよう~
Masahito Zembutsu
 
PDF
UniRx - Reactive Extensions for Unity
Yoshifumi Kawai
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
ThinReports
 
Node.jsでブラウザメッセンジャー
Yahoo!デベロッパーネットワーク
 
アドテク×Scala×パフォーマンスチューニング
Yosuke Mizutani
 
【Unity道場京都スペシャル4】Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
UnityTechnologiesJapan002
 
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Yoshifumi Kawai
 
Ajax 応用
Katsuyuki Seino
 
NAO/Pepper 開発環境 について
Takuji Kawata
 
Serfが面白いと俺の中で話題にwwwwww
Masahito Zembutsu
 
Chrome DevTools.next
yoshikawa_t
 
How To Drink Wsgi
Atsushi Odagiri
 
Apache geode at-s1p
Masaki Yamakawa
 
Node予備校 vol.1 名古屋
Mori Shingo
 
Windows 8時代のUXを支える非同期プログラミング
Yuya Yamaki
 
C#の書き方
信之 岩永
 
C#の書き方
信之 岩永
 
20130315 abc firefox_os
Tomoaki Konno
 
HTML5&API総まくり
Shumpei Shiraishi
 
Programming camp Codereading
Hiro Yoshioka
 
Serf / Consul 入門 ~仕事を楽しくしよう~
Masahito Zembutsu
 
UniRx - Reactive Extensions for Unity
Yoshifumi Kawai
 
Ad

More from Gosuke Miyashita (20)

PDF
Walter ファミリーの紹介 at Shibuya.go#1
Gosuke Miyashita
 
PDF
Serverspec at Testing Framework Meeting
Gosuke Miyashita
 
PPTX
Serverspec at July Tech Festa 2013
Gosuke Miyashita
 
PPTX
Serverspec at hbstudy #45
Gosuke Miyashita
 
PPTX
NoSQLに関するまとめ
Gosuke Miyashita
 
PPTX
Maglica - A Simple Internal Cloud Tool at #techkayac
Gosuke Miyashita
 
PPTX
DevOps とは何か 何であるべきか
Gosuke Miyashita
 
PPTX
Inside Sqale's Backend at RubyConf Taiwan 2012
Gosuke Miyashita
 
PPTX
Ia型超新星とチャンドラセカール限界
Gosuke Miyashita
 
PPTX
How Perl Changed My Life
Gosuke Miyashita
 
PPTX
Inside Sqale's Backend at YAPC::Asia Tokyo 2012
Gosuke Miyashita
 
PPTX
Inside Sqale's Backend at Sapporo Ruby Kaigi 2012
Gosuke Miyashita
 
PPT
Assurer - a pluggable server testing/monitoring framework
Gosuke Miyashita
 
PPTX
Open Source System Administration Framework - Func
Gosuke Miyashita
 
PPTX
10分でわかるDevOps
Gosuke Miyashita
 
PPTX
DevOpsって何?
Gosuke Miyashita
 
PPTX
Puppetのススメ
Gosuke Miyashita
 
PPT
Puppet Best Practices? at COOKPAD
Gosuke Miyashita
 
PPT
How Danga::Socket handles asynchronous processing and how to write asynchrono...
Gosuke Miyashita
 
PPT
Danga::Socketの非同期処理の仕組みとPerlbalで非同期処理するプラグインを書く方法
Gosuke Miyashita
 
Walter ファミリーの紹介 at Shibuya.go#1
Gosuke Miyashita
 
Serverspec at Testing Framework Meeting
Gosuke Miyashita
 
Serverspec at July Tech Festa 2013
Gosuke Miyashita
 
Serverspec at hbstudy #45
Gosuke Miyashita
 
NoSQLに関するまとめ
Gosuke Miyashita
 
Maglica - A Simple Internal Cloud Tool at #techkayac
Gosuke Miyashita
 
DevOps とは何か 何であるべきか
Gosuke Miyashita
 
Inside Sqale's Backend at RubyConf Taiwan 2012
Gosuke Miyashita
 
Ia型超新星とチャンドラセカール限界
Gosuke Miyashita
 
How Perl Changed My Life
Gosuke Miyashita
 
Inside Sqale's Backend at YAPC::Asia Tokyo 2012
Gosuke Miyashita
 
Inside Sqale's Backend at Sapporo Ruby Kaigi 2012
Gosuke Miyashita
 
Assurer - a pluggable server testing/monitoring framework
Gosuke Miyashita
 
Open Source System Administration Framework - Func
Gosuke Miyashita
 
10分でわかるDevOps
Gosuke Miyashita
 
DevOpsって何?
Gosuke Miyashita
 
Puppetのススメ
Gosuke Miyashita
 
Puppet Best Practices? at COOKPAD
Gosuke Miyashita
 
How Danga::Socket handles asynchronous processing and how to write asynchrono...
Gosuke Miyashita
 
Danga::Socketの非同期処理の仕組みとPerlbalで非同期処理するプラグインを書く方法
Gosuke Miyashita
 

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