0

em-ws-client私の質問はそれよりも一般的だと思いますが、私は宝石を使用しています。EventMachine受信ブロックの外部からデータを送信しようとしていますが、データが送信されるまでに非常に長い時間(〜20秒)かかります。

require "em-ws-client"

m = Mutex.new
c = ConditionVariable.new

Thread.new do
  EM.run do
    @ws = EM::WebSocketClient.new("ws://echo.websocket.org")

    @ws.onopen do
      puts "connected"
      m.synchronize { c.broadcast }
    end

    @ws.onmessage do |msg, binary|
      puts msg
    end
  end
end

m.synchronize { c.wait(m) }

@ws.send_message "test"

sleep 100

@ws.send_message "test"メソッドに直接入れると、onopen問題なく動作します。自分のバージョンが機能しない理由がわかりません。この問題はEventMachineで見つかりましたが、関連しているかどうかはわかりません。

なぜこれほど時間がかかるのですか、どうすれば修正できますか?

4

1 に答える 1

1

EventMachineは厳密にシングルスレッドであり、スレッド間でソケットを共有することはお勧めしません。ここに表示されるのは、メインのEventMachineスレッドが、send_message呼び出しを送信したことを認識せず、長期間バッファリングされたままになっているという問題です。

EventMachineでスレッドを使用するときは、非常に注意が必要です。スレッドのタイミングや同期の問題が発生すると、誤動作してクラッシュするのを見てきました。

于 2012-11-18T20:07:58.810 に答える