edit: мне кажется, я исправил проблему: https://gist.github.com/niuage/c0637b8dd10549a12b6a223dbd5f158a
Возможно, мне не хватало Process.wait, поэтому я создал много процессов-зомби.
У меня естьфрагмент кода, который работает большую часть времени, но через некоторое время «блокирует» себя, возможно, из-за состояния гонки.
Мой код
pipe = "goals.png"
(1..100).each do |time|
fork do
# This runs ffmpeg, and gets it to write 1 frame of a video to the pipe 'goals.png'
print "before ffmpeg"
`#{ffmpeg(time, score_crop_options, pipe)}`
exit
end
# Reads from 'pipe'
print "before read"
blob = File.read(pipe)
image = Rocket::Image.from_blob(blob)
# do stuff with image
end
Замечания:
#{ffmpeg(time, pipe)}
пишет в канал и блокирует, пока что-то не читает из канала
File.read (pipe) блокирует, пока что-то пишет в канал
Моя проблема
edit: когда скрипт заблокирован, и я пытаюсь прочитать канал из другого скрипта, я получаю zsh: fork failed: resource temporarily unavailable
.Это, вероятно, хорошая подсказка ...
В большинстве случаев File.read(pipe)
выполняется перед кодом в fork, поэтому он отлично работает, но через некоторое время скрипт просто останавливается: он печатает "before ffmpeg"
и никогда не доберется до "before read"
...
Во-первых, я должен использовать потоки вместо fork?И могу ли я контролировать порядок запуска 2 операторов (чтение и запись), чтобы избежать условия гонки?А может, дело даже не в состоянии гонки, а я что-то упустил?