EventMachine 和 Ruby Threads - 这里到底发生了什么?

2024-02-01

我们一起使用 Rails 和 EventMachine,当将该组合与 Passenger 一起使用时,需要完成一些非常具体的设置。经过大量的试验和错误,我的 EventMachine 初始化运行良好,但我想更好地理解代码。正如您在下面的代码片段中看到的,我们的初始化程序会检查 Passenger,然后在重新启动 EventMachine 之前检查它是否是分叉进程。

if defined?(PhusionPassenger)
  PhusionPassenger.on_event(:starting_worker_process) do |forked|
  # for passenger, we need to avoid orphaned threads
    if forked && EM.reactor_running?
      EM.stop
    end
    Thread.new {
      EM.run do

我的问题与 EM.reactor_running 有关?和 EM.stop 命令。如果 Passenger 已经分叉了我们的进程,为什么我需要在新线程中重新启动 EM 引用?如果 EM.reactor_running?返回 true,我引用哪个 EM 实例?

您可以在我们的博客上查看完整的初始化程序代码http://www.hiringthing.com/2011/11/04/eventmachine-with-rails.html http://www.hiringthing.com/2011/11/04/eventmachine-with-rails.html


首先,每个 Ruby 进程只有一个 EventMachine 实例,因此无论发生什么情况,您都将始终引用相同的 EM 实例,而与当前所在的线程无关。

您在一个新的单独线程中运行反应器,这样它就不会阻塞主线程(其目的是服务 Web 请求)。否则 EM.run 将接管控制权,进入其运行循环,不再离开 EM.run 块。 EM.reactor_running?如果 EM 循环正在某处运行,则返回 true。由于每个 Ruby 进程只有一个,因此该方法很容易确定 EM 是否正在运行。

您此处的设置是在普通 Ruby 进程中使用 EM 的最简单方法,而不会干扰正在运行的其他所有内容。我假设您正在从 Web 应用程序将消息推送到 AMQP 代理。每当您发送消息时,它都会进入单独线程中的 EM 运行循环,这部分对您来说非常透明,并且不会影响主循环,主循环可以继续处理 Rails Web 请求。但要小心,始终使用 EM.next_tick 将事物推入 EM 循环。尝试在不同线程中处理 EM 打开的套接字可能会导致发生不好的事情,我在生产中看到过这种情况,顺便使用和构建了一个名为“发生”的库;)

在开始新循环之前停止 EM 循环可以处理父进程中可能遗留下来的 EM 循环,这可能会导致在父进程中使用 EM 打开的文件描述符出现问题。在自定义代码中,可以使用 EM.fork_reactor 来规避此问题,但由于父进程不受您的控制,因此最安全的做法是检查反应器是否存在并在启动新实例之前停止它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EventMachine 和 Ruby Threads - 这里到底发生了什么? 的相关文章

  • 在 Rails 4 中渲染部分/rake 任务/后台作业/模型中的视图

    我读过很多关于在 rake 任务 后台作业 模型中渲染 Rails 部分和视图的内容 我在 Stackoverflow 和网络上找到的绝大多数内容都描述了在 Rails 3 中工作的方法 但它们似乎已经过时了 而且我没有让它们工作 即使花了
  • 如何跳过 Devise SessionsController 的 before_filter ?

    我有一个before filter in my ApplicationController 也就是说 对于我的项目中的每个控制器 我怎么能够skip before filter对于设计的SessionsController创造行动 这是我的
  • Rails 中的并行方法

    我的 Rails Web 应用程序有数十种方法 从调用 API 到处理查询结果 这些方法具有以下结构 def method one batch query API process data end def method nth batch
  • 无需别名的 Ruby YAML 编写

    我正在从 ruby 将数据写入 yaml 文件 并且经常在该文件上添加别名 像 id001 somekey somevalue id001 就我而言 我使用 yaml 文件来aid可读性并将名称添加到文件中的值 因为现有数据只是 没有键的分
  • 在 ruby​​ 中读/写受密码保护和加密的文件

    我想加密一个 ruby 程序将从中加载数据的文件 此外 我需要程序在启动时提示输入密码 该密码将用于解密文件 换句话说 该文件需要加密地驻留在计算机上 只有拥有密码的用户才能运行该应用程序 我已经开始研究 openpgp 但据我了解 这仍然
  • 由于符号链接错误,无法在 Mac OSX 10.8.1 中安装 ruby​​-1.9.2

    首先 我尝试了常见的rvm安装 rvm安装1 9 2 但是 显示了以下错误 The provided compiler usr bin gcc is LLVM based it is not yet fully supported by r
  • 方法调用中是否有记忆约定?

    我想避免在方法调用中重新评估值 直到现在 我一直在这样做 def some method some method begin lot s of code end end 但它最终变得非常丑陋 在一些代码中 我看到类似以下内容 def som
  • 在任意时间范围内找到最佳日/月/年间隔的算法?

    如果您有时间表 请说 March 19 2009 July 15 2011 是否有一种算法可以将该时间范围分解为 March 19 2009 March 31 2009 complete days April 1 2009 December
  • 设备注册控制器获取零资源的自定义操作

    基本上我想要有两个单独的操作来更改密码和更改电子邮件 而不是只有一个 我已经更新了我的路由以指向继承自 Devise RegistrationsController 的新控制器 我的路线 rb devise for users contro
  • 自定义变形在rails3上不起作用?

    我正在使用 Rails 3 0 1 并在initializers inflections rb 中有以下代码 ActiveSupport Inflector inflections do inflect inflect irregular
  • 如何创建与 ActiveResource 对象的 ActiveRecord 关系?

    假设我正在为一家已经拥有 People 应用程序的出版公司编写一个图书馆应用程序 所以在我的图书馆应用程序中我有 class Person lt ActiveResource Base self site http api people m
  • 数据库分片和 Rails

    在 Rails 中处理分片数据库的最佳方法是什么 分片应该在应用层 活动记录层 数据库驱动层 代理层还是其他层处理 各自的优点和缺点是什么 FiveRuns 有一个名为的 gem数据结构 https github com bpot data
  • ruby 的 String .hash 方法如何工作?

    我只是红宝石的新手 我见过一个字符串方法 String hash 例如 在irb 我试过了 gt gt mgpyone hash returns gt 144611910 这个方法是如何工作的 The hash方法是为所有对象定义的 看文档
  • save_and_open_page 已停止提供我的 CSS

    我的测试设置工作得很好 每当我打电话时 都能提供正确格式的 css 页面save and open page从测试中 然后 我设置了一些 javascript 测试 并对我的设置进行了一些更改 抱歉 我无法详细说明所有内容 我没有足够详细地
  • 在 CircleCI 中设置 Elasticsearch 和 Ruby on Rails

    我正在尝试在 Rails 应用程序中使用 Elasticsearch 设置 CircleCI 我想已经配置了镜像 但是如何在 CI 中连接到它 到目前为止我已经尝试过 https github com elastic elasticsear
  • RSpec 请求规范发布一个空数组

    我目前正在 Rails 中开发 API 端点 如果我需要的数据无效 我想确保端点响应具有正确的错误状态 我需要一个 id 数组 无效值之一是空数组 Valid vendor district ids 2 4 5 6 Invalid vend
  • ||= 是什么意思? [复制]

    这个问题在这里已经有答案了 我的应用程序控制器中有一个受保护的方法 def current user current user User find by id session user id end 我想知道什么 方法 我一直在努力寻找和找
  • 在 ActiveAdmin 或打印解决方案中动态更改分页

    我是 Activeadmin 和 Rails 的新手 我需要一些帮助 我有一个分页模型 我想允许用户更改分页值或完全禁用它 这样它就可以打印 到打印机 所有记录 或过滤后的记录 我知道我可以在 before filter 中使用 per p
  • Rails 4 的 mobile_fu

    我正在尝试将我的应用程序从 Rails 3 2 13 切换到 Rails 4 在此过程中 我遇到了一个主要障碍 我使用 gem mobile fu 来确定用户是否来自移动设备 该 gem 需要 Railties 3 2 13 但 Rails
  • 为什么 Rails 中的区域设置充当全局(使用 Thin 时)?

    我刚刚意识到在控制器中设置区域设置的推荐 Rails 方法 before filter set locale def set locale I18n locale params locale I18n default locale end

随机推荐

  • 如何在 Swift 中多次显示通知?

    有没有办法每 15 秒快速显示一次通知 我通过检查 notification fireDate NSDate timeIntervalSinceNow 15 但它并不是每次只显示一次都有效 我们如何将其作为循环来执行 您无法安排每 15 秒
  • SuperScript 标签或表单名称

    如何在标签或表单名称属性中显示上标字符串 我发现很少有这样的问题one https stackoverflow com questions 15042334 how to add superscript power operators in
  • Xcode,iPhone - 使图像动画朝特定方向移动[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在创建一个应该在屏幕上移动的动画球 我想让它向屏幕中心移动 就好像它被中心吸引一样 我怎样才能做到这一点 你可以试试这个代码 UI
  • PHP oci_connect() TNS: 无法解析连接标识符 (ORA-12154)

    我正在 Ubuntu 服务器上测试一些 PHP 代码 并通过 tnsping 命令检查 Oracle 数据库连接 Used TNSNAMES adapter to resolve the alias Attempting to contac
  • 使用登录调用未定义的函数 mysql_query() [重复]

    这个问题在这里已经有答案了 当我执行我的PHP下面的代码我得到一个致命错误我不知道如何解决它 感谢您的帮助 错误 PHP 致命错误 未捕获错误 调用 Applications MAMP htdocs lprapp config php 23
  • 改造 2 - 当响应状态为 422(不可处理的实体)时,响应正文为空

    我正在使用 Retrofit 在我的网络服务器中发出 POST 请求 但是 当响应状态为时 我似乎无法获取响应正文422 unprocessable entity 响应主体始终是null 我想知道我是否做错了什么或者是否有解决方法 因为我在
  • 命名空间内的未命名命名空间

    我被要求修改的一些代码看起来很像这样 namespace XXX namespace some stuff end of unnamed Some stuff within the scope of XXX end of XXX 我正在努力
  • 我如何使用课程?

    我对编程相当陌生 有一件事让我感到困惑 什么是类 如何使用类 我明白了一点 但我似乎找不到完整的答案 顺便说一句 如果这是特定于语言的 那么我正在使用 PHP 进行编程 编辑 还有一件事我忘了说 具体来说 我的意思是问如何在类中使用定义函数
  • 在 Visual Studio 2015 中创建空 MVC 项目

    我正在使用 VS 2015 Enterprise 并且正在尝试创建一个空的 MVC 项目 我通过右键单击解决方案进入 添加 新项目 对话框 然后 我从左侧列表中选择 Web 然后选择 ASP NET Web 应用程序 如下所示 接下来 将打
  • ES6 代理解决“TypeError: Cannot create proxy with a non-object as target”?

    我的最后一个问题是 如何存储Monoidal List函数链的数据 https stackoverflow com questions 51297054 how to store data of a functional chain of
  • 当 DownValues 已经存在时可以阻止 OwnValues 吗?

    对于已经分配了与名称 a 关联的 DownValues 的情况 是否有一种可接受的方法来阻止将 OwnValues 分配给相同的名称 我最初是在尝试某人实现数据字典时遇到这个问题的 这就是我要避免的 Remove a a 1 somethi
  • [] 类型的特殊运行时表示?

    考虑长度索引向量的简单定义 data Nat Z S Nat infixr 5 gt data Vec n Nat a where V0 Vec Z a gt a gt Vec n a gt Vec S n a 当然 我有时会需要以下功能
  • “registration_ids”字段不是 JSON 数组 (Firebase)

    我遇到了 Firebase registration ids 的问题 当我从 Rest Client 发送请求时 我得到了成功的响应 multicast id 4650719213012935695 success 2 failure 0
  • CSS - 水平导航列表项填充所有可用空间

    使用 CSS 如何才能拥有一个水平列表并让所有列表项填充父空间的可用宽度 我将 li 的左侧浮动 然后对每个应用一些填充 但我似乎无法填充整个宽度 这样就在右侧留下了一个间隙 我可能会将最后一个项目浮动到右侧 但会发生的情况是 导航项目的活
  • 我应该使用哪些字符串操作函数?

    在我的 Windows Visual C 环境中 有很多替代方法可以完成相同的基本字符串操作任务 例如 为了进行字符串复制 我可以使用 strcpy ANSI C 标准库函数 CRT lstrcpy kernel32 dll中包含的版本 S
  • 如何以不同的百分比混合两种颜色

    我有两种颜色和一个视图组件 颜色一是我的组件的背景 我将把背景颜色更改为颜色二 但不是突然的 改变类似动画 例如 第二个 1 90 颜色 1 10 颜色 2 第二个 1 80 颜色 1 20 颜色 2 第二个 1 10 颜色 1 90 颜色
  • 如何迭代数组的数组

    迭代数组的最佳方法是什么 sounds Name 1 link 1 Name 2 link 2 Name 3 link 3 Name 4 link 4 我想要 HTML 格式的输出ul li结构 ul li Name 1 link 1 li
  • java/IBSQL 中的 SQL Firebird 实现

    所以尝试将该 SQL 代码放入我的 java 应用程序中 SELECT DISTINCT StRzImRo Rohstoff StRo Bezeichnung CAST SUM BwLsImAt Lieferungen StRzImRo M
  • 在 Windows 上用 C++ 计算 CPU 时间

    C 有没有办法计算运行给定程序或例程需要多长时间在CPU时间里 我使用在 Windows 7 上运行的 Visual Studio 2008 如果你想知道一个进程使用的CPU时间总量 clock nor rdtsc 直接或通过编译器内在函数
  • EventMachine 和 Ruby Threads - 这里到底发生了什么?

    我们一起使用 Rails 和 EventMachine 当将该组合与 Passenger 一起使用时 需要完成一些非常具体的设置 经过大量的试验和错误 我的 EventMachine 初始化运行良好 但我想更好地理解代码 正如您在下面的代码