Rails и J Ruby - обмен данными сеанса между потоками - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть код в контроллере, который запускает поток, который периодически вызывает веб-сервис, пока не получит определенный ответ, не изменит некоторые переменные сеанса и не выйдет из потока. Переменные сеанса устанавливаются при первом входе пользователя в систему, и этот процесс обновляет их. Процесс выполняется правильно, но значения сеанса не изменяются при поступлении следующего запроса после завершения процесса. Вот упрощенный пример:

session[:test_var_a] = 'A'
session[:test_var_b] = 'B'

#start a job to reload the session data when the run finishes
Thread.new do
    session[:test_var_b] = 'B2'
    SESSION_MUTEX.synchronize do
        sleep(4.seconds)
        session[:test_var_c] = 'C2'
        session
    end
    function_that_takes_some_time(run_id: id)
    Thread.exit
end

Внутри потока сразу после вызова функции все переменные сеанса выглядят так, как я и ожидал (A, B2, C2). Но при следующем запросе, который заканчивается, он выглядит как A, B2, nil. У меня есть другие переменные, которые на самом деле установлены внутри функции, и все они тоже сбрасываются. Почему test_var_b сохраняет значение, установленное в потоке, а остальные - нет? Те, что установлены в функции, также не находятся внутри мьютекса. Связано ли это со временем, что запись в сеанс происходит только тогда, когда исходный запрос не вернулся? Я использую memcache для своего магазина сессий

Спасибо за помощь

...