2016-10-12 2 views
0

Я начинаю тему в контроллере и хочу перенаправить пользователя сразу после этого.Ruby thread dies после перенаправления

class Profile::GeneralController < ProfileController 
    def update 
     startTheThread(profile) 
     #sleep(5) 
     redirect_to 'selection_controller' 
    end 
end 

class ProfileController < ApplicationController 
    def startTheThread(profile = nil) 
     $collector_threads[current_user.id][sector] = Thread.new { 
      Thread.current['collecting_status'] = { a: 1, c: 0, c_id: -1, r: false }    
      start_threaded_collector(sector) 
     } 
    end 
end 

Когда я говорю контроллер спать на - скажем - 5 секунд, нить заканчивается, как предполагалось.

Поток мертв, как только пользователь переходит на другую страницу - почему это так и как я могу поддерживать потоки живого между контроллерами.

+1

Вы используете это на многопоточном сервере? (не webrick) – digicazter

+0

Я бегу «тонким» как webserver – dheil

+1

Вы делаете что-то очень неправильно. Если вам нужна какая-то асинхронная обработка, вы должны использовать ActiveJob, Sidekiq или другую очередь заданий. – meagar

ответ

1

Я с @meagar здесь, это требует серьезных проблем. Предположим, что ваш процесс будет убит после завершения веб-запроса, так как это происходит в некоторых менеджерах процессов Ruby on Rails, когда они обрезают лишние экземпляры.

Обмен данными между экземплярами контроллера также должен считаться невозможным, если вы так или иначе не сохраняете данные: базу данных, сеанс, файлы cookie или аргументы через GET или POST.

В типичной системе на M-машинах будут выполняться процессы N Ruby, и процессы будут запускаться и останавливаться произвольно, без предупреждения, если они не будут активно обрабатывать какие-либо запросы. Невозможно надежно делиться данными между ними без какого-либо внешнего IPC.

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

Как вы могли бы это сделать, нажав задание в очередь Redis, у вас есть другой процесс, который наблюдает за этой очередью за работу и выдает задание и обрабатывает его. Это легко сделать с помощью команды BLPOP в Redis, где ваш поток будет блокировать ожидание работы, а затем немедленно продолжить, когда что-то нужно сделать.

Смежные вопросы