2015-12-16 90 views
1

我需要轉換視頻在4個線程並行運行腳本紅寶石

比如我有活動記錄模式的視頻與標題:視頻1,視頻2,視頻3,VIDEO4,Video5

所以,我需要執行這樣的事情

bundle exec script/video_converter start 

當腳本會處理未轉換的視頻爲4個線程,例如

Video.where(state: 'unconverted').first.process 

但如果4個視頻一個轉換,下一個視頻必須被自動添加到線程

,這是什麼最好的解決辦法? Sidekiq寶石?守護進程gem + Ruby手動線程?

現在我使用這個腳本:

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個視頻之後。我想,在轉換完第四個視頻後,它會自動添加到新的線程中,該線程爲空。

+2

線程在某些運行時間不平行,例如, MRI檢查。你用什麼? – sschmeck

+0

即使使用MRI,它也不是那麼簡單,例如如果調用本地代碼釋放GVL或產生ffmpeg進程 –

+0

我正在使用[spawnling gem](https://github.com/tra/spawnling),我在第一條消息 – rs41

回答

1

如果您的目標是通過僅使用4個線程(或任何Spawnling配置爲使用 - 因爲它支持fork和thread)來處理視頻,那麼您可以使用Queue來排列要處理的所有視頻記錄,產生4個線程並讓它們一個接一個地處理記錄,直到隊列爲空。

require "rails" 
require "spawnling" 

# In your case, videos are read from DB, below array is for illustration 
videos = ["v1", "v2", "v3", "v4", "v5", "v6", "..."] 


THREAD_COUNT = 4 

spawns = [] 

q = Queue.new 

videos.each {|i| q.push(i) } 

THREAD_COUNT.times do 
    spawns << Spawnling.new do 
    until q.empty? do 
     v = q.pop 

     # simulate processing 
     puts "Processing video #{v}" 

     # simulate processing time 
     sleep(rand(10)) 
    end 
    end 
end 

Spawnling.wait(spawns) 

該回答是從this answer

PS啓發:我添加幾個要求和限定videos陣列,使上述代碼自給式運行的例子。

+1

中添加了其他示例如果您不不想立即加載所有未處理的視頻,建立第5個線程,直到隊列低於某個閾值,然後重新填充。 –

+0

@Wand Maker,非常感謝您的建議! 2啓事: 1)你的邏輯,如果我們有這個數組 '[ 「V1」, 「V2」, 「V3」, 「V4」, 「V5」, 「V6」]' 腳本添加因爲直到一個條件爲 的循環,所以[[「v1」,「v2」,「v3」,「v4」,「v5」,「v6」]指向第一個線程,而不指向其他第二,第三和第四個線程 但我需要第一個線程添加「v1」,第二「v2」,第三「v3」,第四「v4」,第一「v5」,第二「v6」等。 – rs41

+0

2 )看起來,您的示例一次添加了視頻,並且在那個過程之後整個數組 但是有時,項目經理會定期添加新視頻,並且我想將此視頻添加到Existing隊列中,而不是添加到新隊列中(因此視頻必須是異步添加到隊列和腳本必須將此視頻添加到當前的4th廣告)。 你怎麼想的? – rs41