酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

[Ruby] Reactorパターンについて

Reactorパターンとは、複数の入力による同時並行なリクエストを扱うための並列プログラミングパターンのことです。ネットワークなどのI/O待ち時間の影響を最低限にすることができるそうです。

例えばWebサーバは複数のユーザーのブラウザからリクエストを受けます。この複数のリクエストをうまく一つづつ捌くときなどに活躍してくれます。

今回はこのReactorパターンを勉強した際のメモ的記事です。ツッコミ大歓迎です!


EventMachine

RubyのReactorパターンの実装を協力にたすけてくれるフレームワークが「EventMachine」です。EventMachineはソケットの受信待機、ネットワーク接続の確立、タイマー処理、長時間かかるタスクをバックグラウンドなスレッドに回すことができるスレッドプールを提供してくれます。

EventMachine/em-http-request

では、EventMachineとEventMachineでのHTTPによる通信をサポートしてくれるGem「em-http-request」をつかって複数のWebサイトにアクセスするサンプルソースを作っていきます。

まずは、Gem em-http-requestをinstall。

1
gem install em-http-request

次にWebサイトにアクセスするサンプルソースのコード。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
require 'eventmachine'
require 'em-http-request'

URL = 'https://twitter.com'

EM.run do
  1.upto(5) do |i|
    # 5回URLを取得するリクエストを出す
    http = EM::HttpRequest.new(URL).get(
      :path => '/',
      :query => '')
    # レスポンスが帰ってきたら呼び出される
    call_back = proc do
      puts http.response
      EM.stop if i == 5 # 5回レスポンスを取得したら終了
    end
    http.callback(&call_back)
  end
end

テストの際は、自分のサーバに対して行うことをおすすめします。

実際はもう少し例を増やしてまとめたかったんですが、まだまだ勉強不足な点を痛感中。 Special Thanksに書いたサイトさん方はとってもわかりやすいんでよかったら、そちらもご覧ください。

Special Thanks

osamunmunのblog: [Ruby] Eventmachineを使った非同期処理

見えないチカラ: 【翻訳】EventMachine入門

今更だけど、em-http-requestの使い方をまとめておく - Satoryu’s Diary(2012-11-13)

おすすめの書籍