#ruby #multithreading #passenger
#ruby #многопоточность #пассажир
Вопрос:
Если я запускаю 1 или 1000 из них в действии контроллера:
Thread.new {
# do some stuff
}
- Действительно ли они будут выполняться асинхронно с http-запросом?
- Если возникает исключение, куда оно попадает?
- Что-нибудь еще, о чем я должен знать?
Ответ №1:
Потоки и исключения не обязательно являются друзьями, поскольку исключения не могут выйти из текущего потока и предупредить родительский поток. Вам также необходимо включить уведомление об исключениях потоков, иначе вы никогда не услышите о них вообще:
Thread.new do
Thread.abort_on_exception = true
end
Вам также нужно будет вызывать Thread.join
каждый новый поток, иначе основной поторопится без них.
Таким образом, ваш код, по крайней мере, остановится при исключении, а не просто завершит поток, который его сгенерировал, и продолжит работу, как будто ничего не произошло.
Убедитесь, что вещи, которые вы вызываете внутри вашего потока, являются потокобезопасными, иначе вы можете получить неожиданные результаты.
Комментарии:
1. 1. вместо того, чтобы делать исключение abort_on_exception, я просто перенесу весь код внутрь в блок перехвата, который сообщает о них (это звучит нормально?) 2. если я присоединюсь к своему основному потоку, это снова сделает мой контроллер синхронным, не так ли?
2. Сообщать об исключениях лучше, чем игнорировать их, это правда. Что касается второго, потоки будут продолжать выполняться независимо даже при вызове
Thread.join
, но основной поток будет ждать их завершения, прежде чем продолжить с этого момента. Таким образом, вы не спешите отправлять ответ до того, как потоки выполнят свою работу.3. Ну ладно. Ну, в этом случае я хочу, чтобы ответ был завершен до того, как потоки выполнили свою работу:-D
4. Не увлекайтесь потоками, когда вам действительно нужно что-то вроде delayed_job . Наличие мошеннических, несвязанных потоков — это путь к катастрофе.
5. Согласен. В этом случае они выполняют простые задачи ведения журнала… но вы правы, всегда есть риск. Я должен установить хотя бы тайм-аут.