Submit Search
イベント駆動プログラミングとI/O多重化
•
Download as PPTX, PDF
•
62 likes
•
15,708 views
Gosuke Miyashita
Follow
2年ぐらい前の社内勉強会で使った資料。
Read less
Read more
1 of 78
Download now
Downloaded 92 times
More Related Content
イベント駆動プログラミングとI/O多重化
1.
イベント駆動プログラミン
グと I/O多重化
2.
イベント駆動プログラミング
3.
イベントを待機し、起こっ たイベントに従って処理を 行うプログラミングパラダ
イム
4.
フロー駆動型プログラミン グと呼ばれる従来のプログ ラミングパラダイムに対す
る概念
5.
GUIプログラミング
6.
キーやマウスの入力をイベ ントとして受け取って処理
7.
ネットワークプログラミ
ング
8.
ネットワークI/Oを多重化して 1プロセス1スレッドで複数の ネットワーク接続を同時に捌
く
9.
非イベント駆動な ネットワークプログラミング
process Client or thread process Client or thread process Client or thread
10.
イベント駆動な ネットワークプログラミング Client
process Client or thread Client
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.
参考文献
Download