Это плохая идея для создания рабочих потоков в процессе сервера? - PullRequest
2 голосов
/ 17 июля 2010

Мой серверный процесс - это в основном API, который отвечает на запросы REST.

Некоторые из этих запросов предназначены для запуска длительных задач.

Это плохая идея сделать что-то подобное?

get "/crawl_the_web" do
  Thread.new do
    Crawler.new # this will take many many days to complete
  end
end

get "/status" do
  "going well" # this can be run while there are active Crawler threads
end

Сервер не будет обрабатывать более 1000 запросов в день.

Ответы [ 3 ]

2 голосов
/ 17 июля 2010

Не самая лучшая идея ....

Используйте фоновый запуск заданий для запуска заданий.

POST /crawl_the_web следует просто добавить задание в очередь заданий. Запускщик фоновых заданий будет периодически проверять наличие новых заданий в очереди и выполнять их по порядку.

Для этого можно использовать, например, delayed_job , настроив отдельный процесс для опроса и запуска заданий. Если вы работаете в Heroku, вы можете использовать функцию delayed_job для запуска заданий в отдельном фоновом работнике / dyno.

0 голосов
/ 04 августа 2010

Запуск потоков во время обработки запросов - плохая идея.

Кроме того, что вы не можете контролировать свои рабочие потоки (запускать / останавливать их контролируемым образом), вы быстро столкнетесь с проблемами, если запустите потоквнутренняя обработка запросов.Подумайте о том, что происходит: запрос завершается, и процесс готовится обработать следующий запрос, в то время как ваш рабочий поток все еще работает и обращается к глобальным ресурсам процесса, таким как соединение с базой данных, открытые файлы, те же переменные класса и глобальные переменные и так далее.Рано или поздно ваш рабочий поток (или любая используемая из него библиотека) каким-то образом повлияет на основной поток и прервет другие запросы, и отладку будет практически невозможно.

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

0 голосов
/ 21 июля 2010

Если вы сделаете это, как вы планируете остановить / перезапустить приложение sinatra?Когда вы, наконец, развернете свое приложение, ваше приложение, вероятно, будет обслуживаться Unicorn, passenger / mod_rails и т. Д. Unicorn будет управлять жизненным циклом своих дочерних процессов и не будет знать об этих давно работающих потоках, которые вы могли запуститьи это проблема.

Как кто-то предложил выше, используйте delayed_job, resque или любую другую систему на основе очередей для запуска фоновых заданий.Вы получаете постоянство рабочих мест, вы получаете горизонтальную масштабируемость (просто запускаете больше рабочих на большем количестве узлов) и т. Д.

...