当前位置: 首页 > 知识库问答 >
问题:

在EventMachine循环外部发送

戚阳
2023-03-14

我使用的是emws客户端gem,尽管我认为我的问题比这更一般。我试图从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。将消息“test”直接发送到onopen方法中,效果很好。我不明白为什么我的版本不起作用。我在EventMachine中发现了这个问题,但我不确定它是否相关。

为什么要花这么长时间,我该怎么解决呢?

共有1个答案

华乐逸
2023-03-14

事件机器严格是单线程的,不建议在线程之间共享套接字。您可能在这里看到的是一个问题,即主EventMachine线程不知道您已经提交了一个send_message调用,并将其缓存了很长一段时间。

在EventMachine中使用线程时,我会非常非常小心。我看到过,如果遇到线程计时或同步问题,它就会出现故障和崩溃。

 类似资料:
  • 我需要在eventmachine上有一个无限循环,它不断地读取redis队列。下面是我的代码。递归是正确的方法吗?我尝试了loop,但无法以那种方式工作。

  • 我试图在任意年份的经济衰退中计算复利。以下promise函数计算可变投资组合的发展。 编辑的清晰度: const是一个从1到20循环一年的数组(是静态的) 三元()在每次运行的不同年份触发,导致不同年份的

  • 我试图处理一个用户输入,并允许只输入浮动。可以输入的浮点数是无限的,但是如果连续输入两个非浮点数,程序将结束。当程序结束时,它将打印所有数字的和。 问题是,每当我运行这个时,它立即运行while循环,将计数增加到2,并中断循环。在取消之前,您只能输入一个非浮点数。 编辑:正如你们中的一些人所指出的,count应该在while循环之前初始化

  • 问题内容: 以下代码段是否会降低性能? 还是这段代码实际上更有意义? 如果在字节码中这两个完全相等,那么显然第一种方法在样式方面看起来更好,但我想确保确实如此。 问题答案: 在当今的编译器中,没有。我在最小范围内声明对象,因为对于下一个家伙而言,它更具可读性。

  • 问题内容: 如果我在一个循环中有一个循环,并且一旦满足一条语句,我想中断主循环,那我应该怎么做? 这是我的代码: 问题答案: 使用标记的中断: 另请参阅 Java代码中的“循环:”。 这是什么,为什么会编译? 文献资料

  • 问题内容: 今天,有人陪我一起滥用Java 中的关键字。我编写了一个简单的循环来验证数组中是否存在某些内容。假设是一个length数组,这是我的代码: 现在有人告诉我这不是一个很好的编程,因为我在循环内使用了该语句,这将导致垃圾回收发生故障。因此,更好的代码将是: 问题是我无法正确解释为什么第一个for循环不是一个好习惯。有人可以给我一个解释吗? 问题答案: 现在有人告诉我这不是一个很好的编程,因