首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使错误中止EventMachine进程

使错误中止EventMachine进程
EN

Stack Overflow用户
提问于 2010-09-11 02:22:20
回答 2查看 1.4K关注 0票数 0

我正在创建一个后台脚本,它使用EventMachine连接到使用WebSockets的服务器。该脚本将使用DelayedJob或Resque运行。我已经能够让它与WebSockets服务器通信并发送消息,但是每当在EventMachine循环中引发错误时,它都不会使脚本崩溃-这是应该发生的事情(也是我需要发生的事情)。我不需要使用EventMachine,因为我只发送WebSocket消息而不接收它们-但我希望在这方面有任何帮助:)谢谢!

代码语言:javascript
复制
#!/usr/bin/env ruby
require 'rubygems'
require 'eventmachine'
require 'em-http'

class Job
  include EventMachine::Deferrable

  def self.perform
    job = Job.new
    EventMachine.run {
      http = EventMachine::HttpRequest.new("ws://localhost:8080/").get :timeout => 0

      http.errback { puts "oops" }
      http.callback {
        puts "WebSocket connected!"
        http.send("Hello watcher")
      }

      http.stream { |msg| }
      job.callback { puts "done" }
      Thread.new { 
        job.execute(http)
        http.close
        EventMachine.stop
      }
    }
  end

  def execute(h)
      sleep 1
      puts "Job Runner!"
      h.send("welcome!")
      sleep 2
      asdsadsa # here I am trying to simulate an error
      sleep 1
      h.send("we are all done!")
      sleep 1
      set_deferred_status :succeeded
  end
end

Job.perform
EN

回答 2

Stack Overflow用户

发布于 2010-11-17 02:34:19

由于您在线程内部导致了异常,您应该将Thread.abort_on_exception设置为true,否则这些错误将不会正确地引发。

票数 4
EN

Stack Overflow用户

发布于 2012-04-25 13:55:57

你根本不需要在这里使用Thread.new,事实上,这样做不是线程安全的(eventmachine本身不是线程安全的,除了EM::Queue、EM::Channel和EM.schedule)。

如果要在execute中执行同步操作,且必须拥有该线程,则需要通过EM.schedule调用h.send,例如:

代码语言:javascript
复制
EM.schedule { h.send("welcome!") }

如果您必须以这种方式拥有该线程,那么您需要从您自己生成的线程中捕获异常。然后,您应该自行停止并关闭,或者只是在主(eventmachine)线程中重新启动:

代码语言:javascript
复制
EM.run do
  thread = Thread.new do
    raise 'boom'
  end
  EM.add_periodic_timer(0.1) { thread.join(0) }
end

如果合适的话,上面的模式可以很容易地枚举周期性计时器中的线程数组。

最后,请注意,异常冒泡(正确的异常报告)仅在EventMachine > 1.0中支持,该版本仍处于测试阶段。要在发生异常时获得可用的回溯,无论是gem install eventmachine --pre还是更好,可以使用Github repo中的master。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3687229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档