そのため、
EventMachineは
Rubyでのネットワーキングのための高速で簡単なフレームワークです。
EventMachineは、イベント指向(非同期)ネットワーク接続処理ツールを使用します。 (ネットワーク上の多くの情報は、ネットワーク接続を処理するための同期モデルと非同期モデルの違いに当てられています)。
ロシア語を話すインターネットでは、この素晴らしい宝石に関する情報が非常に乏しいため、この記事を投稿しています。
Rubyプログラマーに十分な標準をインストールします。
gemインストールeventmachine
ドキュメンテーションの例から始めましょう(少し変更されています):
require 'rubygems' require 'eventmachine' class EchoServer < EventMachine::Connection def post_init puts " " end def receive_data data send_data ">>>
次に、順番に分析します(逆の方が便利です)。
EventMachine :: run-メッセージ処理サイクル(
EventReactor )を初期化して開始します。この関数からの戻りは、
stop_event_loopメソッドが
呼び出されたときにのみ発生します。 メッセージ処理サイクルの開始前に実行されるブロックをメソッドに渡すことができます(そして必要です)。 たとえば、ここでサーバーを初期化したり、タイマーを設定したり、クライアント接続を確立したりできます。 この例では、エコーサーバーを起動します。これには、メソッド(
EventMachineモジュールのメソッド)
EventMachine :: start_serverを使用します。そのパラメーターはリッスン用のIPアドレスとポートです。この例では、IPは空なので、任意のホストに接続できます。 次の、おそらく最も重要なパラメーターは接続ハンドラーです。たとえば、クラス(
EventMachine :: Connectionのサブクラス )またはモジュール(この場合、モジュールは
EventMachine :: Connectionの匿名サブクラスと混合し
ます )です。 この例では、これは
EchoServerクラスです。
サーバーへの各接続は、EchoServerクラスの独自のオブジェクトを開始します!!!
メッセージ処理サイクル(
EventReactor )では、メッセージがトリガーされます-このコンテキストでは、これらは
EchoServerクラス
オブジェクトのメソッドの呼び出しです。 主なメッセージは次のとおりです。
- post_init-接続が確立された後に呼び出されます
- unbind-接続が切断されたときに呼び出されます
- receive_data-接続からメッセージを受信したときに呼び出されます
上記の例では、クライアントとの接続を確立した後、接続が閉じられると「サーバーに接続しています」というメッセージが表示されます。 メッセージが受信されると、
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("
一般に、
EventMachineを使用したプログラミングは通常よりもやや複雑です。 これは、非同期性、多数のブロックの使用、プロシージャなどが原因です。 上記の例では、これはほとんど見えませんが、
EventMachineを使用する場合は、それに直面する必要があります。