Ruby IMAP IDLE параллелизм - как решать? - PullRequest
1 голос
/ 09 апреля 2011

Я пытаюсь создать (пока частное) веб-приложение, которое будет использовать соединения 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

Это будет работать, но не без цикла в нижней части, чтобы позволить потокам работать?

Мой вопрос: как мне лучше плавить это вместес моим приложением Ruby On Rails на Heroku?Я не могу блокировать поток с помощью последнего цикла - так как мне это запустить?Другой сервер?Дина более - возможно, рабочий?Я немного читал о Event Machine - может ли это решить мою проблему, если да, то как мне написать это?

Другое дело, что я хотел бы иметь возможность добавлять новые клиенты imapи удалить текущие на лету.Как это может выглядеть?Возможно, что-то с очередью?

Любая помощь и комментарии очень ценятся!

1 Ответ

0 голосов
/ 04 марта 2012

Я не знаком со спецификой RoR, Event Machine и т. Д., Но кажется, что вы хотите настроить производителя / потребителя.

Производитель - это ваша нить, которая слушаетдля изменений с сервера IMAP.Когда он получает изменения, он записывает их в очередь.Похоже, вы захотите настроить несколько производителей, по одному для каждого соединения IMAP.

Ваш потребитель - это поток, который блокирует чтение из очереди.Когда что-то попадает в очередь, оно разблокируется и обрабатывает событие.

Тогда ваш главный поток будет свободен делать все, что вы захотите.Похоже, вы хотите, чтобы ваш основной поток выполнял такие вещи, как добавление новых клиентов IMAP (т. Е. Производителей) и удаление текущих на лету.

Что касается того, где вы будете запускать эти вещи: вы можете запуститьпотребители и производители в одном исполняемом файле, в разных исполняемых файлах на одном и том же компьютере или на разных компьютерах ... все в зависимости от ваших обстоятельств.

HTH

...