我已經構建了一個ruby腳本來創建文件夾,將文件移動到該新文件夾中,然後調用一個system()
調用來觸發FFMPEG。現在我已將它轉換爲4個線程,以便我可以一次執行4個併發轉碼。Ruby - Threads and Dir [] arrays
這裏是2個線程(減去文件夾結構創建和文件移動功能)的示例:
def transcode_process_1
Dir["path/file/source/*.mxf"].each do |f|
random_folder = #code for random folder creation
file_move = #code to move .mxf file to random_folder for processing
system("FFMPEG -i #{random_folder} command 2> /path/file/#{random_filename}.txt")
sleep(2)
end
end
def transcode_process_2
sleep(3)
Dir["path/file/source/*.mxf"].each do |f|
random_folder = #code for random folder creation
file_move = #code to move .mxf file to random_folder for processing
system("FFMPEG -i #{random_folder} command 2> /path/file/#{random_filename}.txt")
sleep(4)
end
end
transcode_thread_1 = Thread.new{transcode_process_1()}
transcode_thread_2 = Thread.new{transcode_process_2()}
transcode_thread_1.join
transcode_thread_2.join
此遍歷迪爾「路徑/文件/源極/」並處理髮現的任何.mxf文件。我遇到的問題是,當兩個線程都在運行時,它們將相同的文件添加到數組中。這導致FFMPEG指出它找不到該文件(這是因爲另一個線程已經處理它並將其移至臨時文件夾)並創建多餘的文件夾和日誌文件,基本上只是使其變得凌亂。
我的問題是我將如何去確保transcode_thread_2
不處理文件transcode_thread_1
已添加到它的數組?有沒有辦法讓我可以檢查數組中的文件是否仍然存在?如果確實如此,那麼執行該過程,如果不移動到下一個文件?
感謝
嘗試使用[隊列](HTTP ://ruby-doc.org/stdlib-2.0.0/libdoc/thread/rdoc/Queue.html)來保存文件列表,並在線程之間共享它 –
難道你不能把文件分割成2-3個-4數組,然後在2-3-4線程中處理它們,所以它們不重疊? –
最簡單的情況下,你可以得到函數來測試'如果File.exist?(f)' –