мне нужно конвертировать видео в 4 нитиЗапуск скриптов параллельно в рубине
Например, у меня есть активные модели Запись видео с названиями: video1, video2, Video3, Video4, Video5
Итак, мне нужно выполнить что-то вроде этого
bundle exec script/video_converter start
Где скрипт будет обрабатывать непрореагировавших видео для 4 потоков, например
Video.where(state: 'unconverted').first.process
Но если одно из 4 видеороликов преобразовано, следующее видео должно автоматически добавляться в поток
Какое это лучшее решение? Sidekiq gem? Демоны gem + Ruby Threads вручную?
Сейчас я использую этот скрипт:
THREAD_COUNT = 4
SLEEP_TIME = 5
logger = CONVERTATION_LOG
spawns = []
loop do
videos = Video.where(state:'unconverted').limit(THREAD_COUNT).reorder("ID DESC")
videos.each do |video|
spawns << Spawnling.new do
result = video.process
if result.nil?
video.create_thumbnail!
else
video.failured!
end
end
end
Spawnling.wait(spawns)
sleep(SLEEP_TIME)
end
Но этот сценарий ждет 4 видео, и после того, как он занимает еще 4 видео. Я хочу, чтобы после преобразования одного из 4-го видео он будет автоматически добавлен в новый поток, который пуст.
Резьбы не параллельны в некоторых режимах работы, например. МРТ. Что ты используешь? – sschmeck
Даже с МРТ это не так просто, например. если вы вызываете собственный код, который освобождает GVL или порождает процесс ffmpeg –
Я использую [sprown gem] (https://github.com/tra/spawnling), добавлен дополнительный пример к первому сообщению – rs41