我正在使用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(',')}] }"
endhandle_join是从我的cramp操作的on_message事件处理程序中调用的,因为Cramp支持同步和纤程,在客户端加入通道后,@subscriber.subscribe块作为非阻塞块运行,这意味着它接受在pubsub通道上获取的消息,并且不会阻塞进程中的其他所有内容(应用程序没有被阻塞),但是它不会移动到下一行(puts "fetching history items"),这对我来说是一个主要问题。有谁得到了一个提示,可以做些什么来纠正这个问题吗?
https://stackoverflow.com/questions/12678094
复制相似问题