Ruby IMAP IDLE并发 – 如何解决?

我正在尝试构建一个(私有的,现在的)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更多 – 也许是一个工人? 我一直在阅读关于Event Machine的一些内容 – 这可以解决我的问题,如果是这样,我该如何写这个呢?

另一件事是,我希望能够添加新的imap客户端并在运行中删除当前的客户端。 那怎么样? 也许有队列的东西?

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

我不熟悉RoR,Event Machine等的细节 – 但似乎你想要建立一个生产者/消费者。

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

您的使用者是一个阻止从队列中读取的线程。 当某些东西进入队列时,它会解锁并处理该事件。

然后你的主线程可以自由地做你想做的任何事情。 听起来你想要你的主线程做一些事情,比如添加新的IMAP客户端(即生产者)并在运行中删除当前的线程。

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

HTH