2

Cramp フレームワークを Redis gem と em-synchrony および WebSockets と共に使用して、チャット関連の Web アプリケーションを構築していますが、いくつか問題があります。

次のコードを検討してください。

class DrawingAction < Cramp::Action
  use_fiber_pool

  self.transport = :websocket

  on_start :user_joined
  on_data :message_received
  on_finish :user_left

  def user_joined
    # Create pub/sub clients for the user who just joined
    initialize_pub_sub
  end

 def initialize_pub_sub
   @@redis_client ||= Redis.new(:driver => :synchrony)

   @publisher ||= Redis.new(:driver => :synchrony)
   @subscriber ||= Redis.new(:driver => :synchrony)
 end


def handle_join(join_data)
  room_name = join_data[:room_name]

  @subscriber.subscribe(room_name) do |on|
    on.message do |channel, message|
      render message
    end
  end

  puts "fetching history items"
  history_items = history_for_room(room_name)
  render "{ \"history\": true, \"time:\": #{Time.now.to_f}, \"data\": [#{history_items.join(',')}] }"
end

handle_join私の Cramp アクションのイベント ハンドラーから呼び出されていon_messageます。cramp は同期とファイバーをサポートしているため、クライアントがチャネルに参加した後、@subscriber.subscribe ブロックは本来のようにノンブロッキングとして動作します。つまり、pubsub でフェッチされたメッセージを受け入れることを意味します。チャネル、およびプロセス内の他のすべてをブロックしません (アプリケーションはブロックされません)、しかし、次の行に移動しません ( puts "fetching history items") 私にとって大きな問題です。この問題を修正するには?

4

1 に答える 1

0

Crampはそれほど便利ではなかったので、プレーンなSinatraを使用できます例を次に示します。rack-fiber_poolミックスに追加することを検討してください。Synchronyアダプターは同じ目的では機能しませんでした()。

于 2012-10-08T10:49:58.157 に答える