2015-05-28 4 views
1

Вот некоторые примеры кода из файла в моей конфигурации директории/инициализаторов:Rufus-scheduler: Как обеспечить выполнение определенного количества заданий, выполняемых в любой момент времени?

scheduler = Rufus::Scheduler.singleton(:max_work_threads => 20) 

. 
. 

job_id = scheduler.every '5s' do 
    # do stuff that may take 1 minute or 50 minutes 
    method_call_one 
    log "method one finished" 
    method_call_two 
    log "method two finished" 
    method_call_three 
    log "method three finished, all done!" 
end 

Однако, как выполнение продолжается, я обнаружил, что более 20 таких рабочих мест работает в любой момент времени (последняя регистрация линия не вызывается более 20 файлов журналов, заполненных во время выполнения). Я не понимаю, как работает руфус? Пожалуйста, порекомендуйте. Все, что я хочу сделать, это убедиться, что одновременно запускается не более 20.

EDIT: Ruby версии - рубин 1.9.3p484 (2013-11-22) [i386-mingw32] Rails версии - Rails 3.2.0

EDIT 2: Вот то, что я пытался вставить в начале блока:

if scheduler.running_jobs.length > MAX_CONCURRENT_STUFF_ALLOWED 
    next 
end 

где MAX ... - положительное целое число. Это просто не имеет никакого эффекта.

Спасибо!

+0

Пожалуйста, разверните свой вопрос, указав код, который вы используете, чтобы подсчитать «сколько заданий работает». Максимальная рабочая нить устанавливает ограничение количества потоков, а не количества заданий. Также просьба указать a) Ruby version b) Rails server (webrick, пассажир, единорог, ...). Без этих фрагментов информации вам сложно помочь. – jmettraux

+0

Итак, вы просто доказали мою точку зрения, я не понимаю Руфуса. Нет другого кода, который я использую для подсчета количества заданий, я думал, что настройка max_work_threads заключается в том, как я должен ее применять. Я обновил вопрос с версиями ruby ​​и rails, соответственно. –

+0

Ответьте на мой вопрос b), это очень важно. Теперь о вашем «И все же, по мере того как выполнение продолжается, я обнаруживаю, что более 20 таких заданий работают в любой момент времени», как вы это обнаружите? – jmettraux

ответ

0

В rufus-scheduler нет способа установить максимальные задания, только максимальные потоки.

Вы можете определить, сколько рабочих потоков используемые в настоящее время оценки

scheduler.work_threads.size 

Если max_work_threads не уважал, пожалуйста, заполните подробный отчет выпуск с шагом воспроизведения на https://github.com/jmettraux/rufus-scheduler/issues

Это также может помочь log https://github.com/jmettraux/rufus-scheduler#schedulerrunning_jobs и др.

Я старался заставить вас рассказать мне, какой сервер вы используете, поскольку некоторые серверные реализации запускают несколько процессов ruby ​​и, следовательно, несколько планировщиков и которые могут соответствовать вашим симптомам (блокировка справки в этих случаях https://github.com/jmettraux/rufus-scheduler#lockfile--mylockfiletxt и ее абзац).

также более 20 файлов журнала, заполняется во время выполнения

Вы имеете в виду, что каждый из ваших Руфус-планировщик заданий получает свой собственный файл журнала? Обычно в OS-процесс входит один или два файла журнала. Почему эта исключительная настройка?

Благодарим за сообщение с точностью, это экономит время.

+1

Спасибо за помощь. Поэтому, если я не могу обеспечить какой-либо максимальный показатель работы, тогда rufus-scheduler не является жизнеспособным решением для реализации, которую я пытаюсь достичь, правильно? Кроме того, спасибо за руководство по типу сервера Rails, это то, что написано: >> Тонкий веб-сервер (v1.5.0 кодовое имя Нож) >> Максимальное количество соединений, установленных на 1024 >> Прослушивание 0.0.0.0:3000, CTRL + C для остановки. Означает ли это, что «нож» или «тонкий» - это то, что вы искали? –

+1

Кроме того, чтобы ответить на ваш другой вопрос, у нас есть один журнал master-Rails для общей информации и сообщений об ошибках, но также есть файл журнала, созданный для каждого запуска задания, потому что содержимое задания представляет собой довольно разделенное транзакции в нашей системе. Добавлено изменение основного вопроса, чтобы показать, что еще я пробовал. –

+0

Я не могу ответить: «rufus-scheduler не является жизнеспособным решением для реализации, которую я пытаюсь достичь, правильно?» потому что вы не доказываете, что rufus-scheduler работает более 20 рабочих мест за раз. Если вы можете выводить scheduler.running_jobs/scheduler.work_threads в свои журналы, а затем показывать один из этих журналов (https://gist.github.com ftw), тогда я могу сказать вам «хорошо, что-то не так», а затем, в конце концов, rufus-scheduler не может делать то, что вам нужно ». Но пока вы ничего не показываете с scheduler.running_jobs> 20 – jmettraux