RubyとEventMachine

そのため、 EventMachineRubyでのネットワーキングのための高速で簡単なフレームワークです。 EventMachineは、イベント指向(非同期)ネットワーク接続処理ツールを使用します。 (ネットワーク上の多くの情報は、ネットワーク接続を処理するための同期モデルと非同期モデルの違いに当てられています)。

ロシア語を話すインターネットでは、この素晴らしい宝石に関する情報が非常に乏しいため、この記事を投稿しています。



Rubyプログラマーに十分な標準をインストールします。

gemインストールeventmachine



ドキュメンテーションの例から始めましょう(少し変更されています):



require 'rubygems' require 'eventmachine' class EchoServer < EventMachine::Connection def post_init puts "  " end def receive_data data send_data ">>> #{data}" close_connection if data =~ /quit/i end def unbind puts " " end end EventMachine::run { EventMachine::start_server '', 8081, EchoServer }
      
      







次に、順番に分析します(逆の方が便利です)。



EventMachine :: run-メッセージ処理サイクル( EventReactor )を初期化して開始します。この関数からの戻りは、 stop_event_loopメソッドが呼び出されたときにのみ発生します。 メッセージ処理サイクルの開始前に実行されるブロックをメソッドに渡すことができます(そして必要です)。 たとえば、ここでサーバーを初期化したり、タイマーを設定したり、クライアント接続を確立したりできます。 この例では、エコーサーバーを起動します。これには、メソッド( EventMachineモジュールのメソッド) EventMachine :: start_serverを使用します。そのパラメーターはリッスン用のIPアドレスとポートです。この例では、IPは空なので、任意のホストに接続できます。 次の、おそらく最も重要なパラメーターは接続ハンドラーです。たとえば、クラス( EventMachine :: Connectionのサブクラス )またはモジュール(この場合、モジュールはEventMachine :: Connectionの匿名サブクラスと混合します )です。 この例では、これはEchoServerクラスです。

サーバーへの各接続は、EchoServerクラスの独自のオブジェクトを開始します!!!

メッセージ処理サイクル( EventReactor )では、メッセージがトリガーされます-このコンテキストでは、これらはEchoServerクラスオブジェクトのメソッドの呼び出しです。 主なメッセージは次のとおりです。



上記の例では、クライアントとの接続を確立した後、接続が閉じられると「サーバーに接続しています」というメッセージが表示されます。 メッセージが受信されると、 send_dataメソッドを使用してメッセージが送信され(メッセージを送信)、終了メッセージが受信されると、接続が閉じられます。

クラスメソッドの詳細については、ドキュメントを参照してください。



クライアントでは、すべてがほぼ類似しています-ロシア語を含むインターネット上の例を見つけることができます。

一般的に、最も簡単な方法はtelnetを使用してテストすることです。

telnet localhost 11777



さらに興味深いトピックを検討します。

私はすでにEventMachineを使用して行われたハブチャットで会いましたが、すべての特典はそこで使用されませんでした。 次に、簡単なチャットを作成します(嘘はつきませんが、コードを少し修正すると、彼は間違いなく1000の接続に耐えると思います。ヒントはEventMachine.deferメソッドです)。



EventMachine :: Channel channelsを検討してください。 このメカニズムはまったく新しいものではなく、さまざまなシステムで使用されており、さらにパターン全体です。 メカニズムは次のとおりです-チャンネル(オフィスビルの床の長い廊下など)があり、サブスクライバー(廊下で起こるすべてを聞くためにドアを開いた人)がいます。 加入者(ドアを開けなかった人)でさえ、だれでもチャネルにメッセージを送信でき(廊下で何でも叫ぶ)、すべての加入者がそれを受信します(聞こえます)。 チャンネルの登録を解除できます(ドアを閉めます)。



そのため、チャネルには、 サブスクライブ (サブスクライブ)、 プッシュ (メッセージの送信)、 アンサブスク ライブ (アンサブスクライブ)の3つのメソッドがあります。 以下にチャットの実装を示します(1つのチャネル-ルーム)



 require 'rubygems' require 'eventmachine' require 'socket' class User < EventMachine::Connection @@room = EventMachine::Channel.new attr_reader :port, :ip, :sid def receive_data data @@room.push("#{ip}:#{port} >>> #{data}") close_connection if data =~ /quit/i end def unbind str = " #{ip}:#{port}\n" @@room.push(str) puts str @@room.unsubscribe(sid) end def post_init @port, @ip = Socket.unpack_sockaddr_in(get_peername) str = "  #{ip}:#{port}\n" @sid = @@room.subscribe { |msg| send_data msg } @@room.push(str) puts str end end EventMachine::run { EventMachine::start_server '', 11777, User }
      
      







一般に、 EventMachineを使用したプログラミングは通常よりもやや複雑です。 これは、非同期性、多数のブロックの使用、プロシージャなどが原因です。 上記の例では、これはほとんど見えませんが、 EventMachineを使用する場合は、それに直面する必要があります。



All Articles