Ruby IMAP IDLE 并发 - 如何解决?

2024-05-08

我正在尝试构建一个(目前是私有的)Web 应用程序,该应用程序将利用 IMAP IDLE 连接在人们到达时显示电子邮件。

我很难弄清楚如何将其组合在一起 - 以及它如何与我的 Heroku RoR 服务器结合在一起。

我编写了一个用于连接到 IMAP 服务器并空闲的基本脚本,看起来像这样(简化):

imap = Net::IMAP.new server, port, usessl
imap.login username, password
imap.select "INBOX"

imap.add_response_handler do |response|
  if resp.kind_of(Net::IMAP::UntaggedResponse) && resp.name == "EXISTS"
    # New mail recieved. Ping back and process.
  end
end

imap.idle
loop do
  sleep 10*60
  imap.renew_idle
end

这将与 IMAP 服务器建立一个连接并开始空闲。正如你所看到的,这是循环阻塞的。

我希望我的用户有多个 IMAP 连接同时处于空闲状态。最初,我只是想将它们放在一个线程中,如下所示:

Thread.new do
  start_imap_idling(server, port, usessl, username, password)
end

我对线程还不是那么敏锐,但是使用这个解决方案,我仍然需要阻止我的主线程来等待线程?所以如果我做类似的事情:

User.each do |user|
  Thread.new do
    start_imap_idling(server, port, usessl, username, password)
  end
end

loop do
  # Wait
end

这可以工作,但如果没有底部的循环来允许线程运行,就不行了?

我的问题是如何最好地将其与 Heroku 上的 Ruby On Rails 应用程序融合在一起?我不能用最后一个循环阻塞线程 - 那么我该如何运行它呢?另一个服务器?一个dyno more - 也许是一个工人?我一直在阅读一些有关事件机器的内容 - 这可以解决我的问题吗?如果可以,我应该如何写这个?

另一件事是,我希望能够添加新的 imap 客户端并动态删除当前的客户端。看起来怎么样?也许需要排队?

非常感谢任何帮助和评论!


我不熟悉 RoR、Event Machine 等的细节——但看起来你想设置一个生产者/消费者。

生产者是您的线程,它正在侦听来自 IMAP 服务器的更改。当它收到更改时,会将它们写入队列。您似乎想要设置多个生成器,每个 IMAP 连接一个。

您的消费者是一个在从队列读取时阻塞的线程。当有东西进入队列时,它会解除阻塞并处理该事件。

然后你的主线程就可以自由地做任何你想做的事情。听起来您希望主线程执行诸如添加新 IMAP 客户端(即生产者)和动态删除当前客户端之类的操作。

至于你在哪里运行这些东西:你可以在一个可执行文件中运行消费者和生产者,在同一台机器上的单独可执行文件中运行,或者在不同的机器上运行......这一切都取决于你的情况。

HTH

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

Ruby IMAP IDLE 并发 - 如何解决? 的相关文章

随机推荐

  • Spring Boot CSRF

    尝试在最新的Spring Boot上实现CSRF保护 互联网上的所有示例都是基于用户登录和身份验证 我不需要 我的网站没有任何需要身份验证的部分 我想 1 休息请求来自站点内部 不允许来自外部的 wget 直接请求 2 所有页面 路由 必须
  • 链接悬停时的淡入淡出效果?

    在许多网站上 例如http www clearleft com http www clearleft com 您会注意到 当将鼠标悬停在链接上时 它们会淡入不同的颜色 而不是立即切换 默认操作 我假设 JavaScript 是用来创建这种效
  • Express.js在控制器中获取http方法

    我正在构建一个注册表单 本地护照作为身份验证 表单作为表单助手 因为注册只知道 GET 和 POST 我想在一个函数中完成整个处理 换句话说 我正在寻找类似的东西 exports register function req res if r
  • 从 Air Native 扩展返回结构

    是否可以从本机代码返回结构 返回 int 或 boolean 相对简单 但是如何将更复杂的结构返回给动作脚本 您可以返回任何可以在本机代码中表示为 FREObject 的对象 这实际上包括任何 Actionscript 类或 Actions
  • viewDidLoad 中的帧大小错误[重复]

    这个问题在这里已经有答案了 可能的重复 为什么我必须在 viewDidLoad 中手动设置视图的框架 https stackoverflow com questions 6757018 why am i having to manually
  • Angular-ui State - 多个视图看不到我的解析数据

    由于某种原因 当使用多个命名视图 angular ui ui router 时 控制器看不到我的resolvedData 有人遇到过这个问题吗 stateProvider state page abstract true templateU
  • Windows 批处理文件:如何启用命令的内联回显

    如果在 Windows 批处理文件中默认禁用 echo 是否有办法为特定命令 内联 启用它 我知道可以回显特定命令disabled通过在命令前添加 但是有没有办法做相反的事情呢 例如 假设有一个像这样的批处理文件 echo off cmd1
  • UITableView 顶部出现间隙[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我不确定现在问这个问题是否合适 我正在表视图上使用 Xcode 5 预览版 现在的问题是我的表格视图是否被选择为group比我在第一个单元
  • 由于触摸事件上的类切换/高度变化而导致可点击区域错位

    如果您切换上方元素的高度 则触摸设备上的链接可点击区域会出现奇怪的行为 如果您运行以下代码片段 例如 将其保存在本地并使用 chrome 来模拟触摸事件 您会注意到哈希值 mylink在某些情况下 您没有点击红色链接区域 会将 url 添加
  • Android NullPointerException 在视图或适配器中或

    我不知道还能去哪里看 我对这个错误感到疯狂 它不是来自使用空变量 它似乎只是重新启动应用程序而不更改任何代码 有谁知道 java lang NullPointerException Attempt to invoke virtual met
  • 如何在Java中查找年月日中两个日期之间的差异? [复制]

    这个问题在这里已经有答案了 假设我有 Employee模型有开始日期作为其属性变量和晋升型号有促销日期 我想知道员工在晋升之前已经工作了多长时间 我必须找到 PromotionDate 和 startDate 之间的差异 如果我得到 sta
  • HTML 表单:POST 对象数组

    提交班级名单 一次添加3名学生 每个学生都有最初 最后的年龄 问题 我们如何才能将所有学生放入数组中 students 0 gt Array first gt first name for 0 last gt last name for 0
  • C# Winform(实体框架)- 将数据绑定 DataGridView 或 BindingSource 转换为 DataTable

    我正在使用 C Winforms 和实体框架 我的项目基于此链接建模 与 WinForms 的数据绑定 https msdn microsoft com en us data jj682076 aspx 我的问题是如何转换DataGridV
  • 为什么Mysql的Group By和Oracle的Group by行为不同

    为什么Mysql的Group By和Oracle的Group by行为不同 我多次发现 Mysql group By 功能和 Oracle 的 GroupBy 功能表现不同 很多时候我在Oracle中发现错误 这实际上是错误的查询 但是My
  • Magento 2 REST API 客户自定义属性

    Magento 2 REST API 文档解释了在更新或创建客户时设置custom attributes 的方法 http devdocs magento com swagger index 20 html http devdocs mag
  • 循环更改多个数据帧

    例如 我有这三个数据集 就我而言 它们更多并且有很多变量 data frame1 lt data frame a c 1 5 3 3 2 b c 3 6 1 5 5 c c 4 4 1 9 2 data frame2 lt data fra
  • 如何将每个句子的第一个字母大写?

    我正在尝试编写一个程序 将每个句子的第一个字母大写 这是我到目前为止所拥有的 但我不知道如何在句子之间添加句号 例如 如果我输入 你好 再见 输出是 你好再见 并且期间已经消失 string input Enter a sentence s
  • 如何创建自定义 Powershell 运算符?

    是否可以在 Powershell 中创建自定义运算符 而且 我该怎么做呢 我搜索过谷歌 但没有任何结果 我特指一个中缀运算符 示例列表 包含 元素 我已经创建了 cmdlet 使用 Powershell 和 C 模块等 所以我只需要大概的内
  • Python Spark DataFrame:用 SparseVector 替换 null

    在 Spark 中 我有以下名为 df 的数据框 其中包含一些空条目 id features1 features2 185 5 0 1 4 0 1 0 null 220 5 0 2 3 0 1 0 10 1 2 6 0 1 225 null
  • Ruby IMAP IDLE 并发 - 如何解决?

    我正在尝试构建一个 目前是私有的 Web 应用程序 该应用程序将利用 IMAP IDLE 连接在人们到达时显示电子邮件 我很难弄清楚如何将其组合在一起 以及它如何与我的 Heroku RoR 服务器结合在一起 我编写了一个用于连接到 IMA