Потокобезопасность в рельсах с помощью slack-api gem

Я только начал использовать рельсы. В моем приложении мне нужен доступ к API Slack, поэтому я использую гем slack-api. Способ настройки это

Slack.configure do |config|
  config.token = "token"
end

Мне интересно, поскольку токен настроен на уровне класса «Slack», вызовет ли это какое-либо непоследовательное поведение? Один запрос может установить для него значение A, а до того, как это будет сделано, другой запрос может установить для него значение B.


person Sudhagar    schedule 28.06.2015    source источник
comment
Где вы устанавливаете это значение? Похоже, это должно быть в файлах конфигурации среды вашего приложения или в инициализаторе, и в этом случае оно предварительно загружается один раз при запуске вашего приложения. Кроме того, если вы не используете jruby или rubinius, вам не нужно беспокоиться о безопасности потоков с такими вещами.   -  person tpbowden    schedule 28.06.2015
comment
@tpbowden Этого нет в инициализаторе. Пока он находится в слабом контроллере omniauth. Поскольку значения токенов каждый раз разные, я снова запускаю config.   -  person Sudhagar    schedule 28.06.2015
comment
Приложения Rails являются однопоточными, поэтому у вас не возникнет никаких проблем, если только вы не используете версию ruby ​​с реальными потоками и не создаете их вручную.   -  person tpbowden    schedule 28.06.2015
comment
Спасибо @tpbowden, думаю, мне нужно больше читать по этой теме.   -  person Sudhagar    schedule 28.06.2015
comment
@Sudhagar: Ты прав. Этот код может вызвать проблемы, если вы используете многопоточную среду. Возможно, вы захотите прочитать этот ответ о многопоточных серверах Rails.   -  person spickermann    schedule 29.06.2015


Ответы (1)


Хотя веб-фреймворки Ruby обычно являются однопоточными, это не всегда так. Таким образом, это, вероятно, вызовет проблемы, если токен отличается для нескольких запросов, будет трудно рассуждать или станет проблемой в долгосрочной перспективе.

Попробуйте новый гем, https://github.com/dblock/slack-ruby-client который возьмет токен в инициализатор, т.е. Slack::Web::Client.new(token: 'token') или Slack::RealTime::Client.new(token: 'token') должны полностью исключить проблему.

person dB.    schedule 02.08.2015