Использование сигналов прерывания и продолжения в рубине
У меня есть эта программа, которая загружает фотографии в базу данных через API. Однако обработка и загрузка всех этих изображений занимает довольно много времени, и я хочу иметь возможность останавливать и возобновлять процесс в произвольные моменты времени. Я думал, что сигналы прерывания и продолжения могут быть хорошим (временным!) Решением этой проблемы.
def upload
photos.each do |photo| # photos is an array of all photos.
api_client.upload_photos(photo.to_h)
end
end
def to_h
# Returns an hash of photos with an id and photo url
# { id: 123, url: "http://www.example.com/img/1"
end
Как мне это сделать?
1 ответ
Решение
Вам не нужно ничего делать в Ruby для отправки сигналов SIGTSTP и SIGCONT.
Чтобы остановить запущенный процесс, просто нажмите Control+Z:
$ ruby -e "loop { puts Time.now; sleep 1}"
2013-09-11 12:37:47 +0200
2013-09-11 12:37:48 +0200
2013-09-11 12:37:49 +0200
2013-09-11 12:37:50 +0200
2013-09-11 12:37:51 +0200
^Z
[1] + 13764 suspended (signal) ruby -e "loop { puts Time.now; sleep 1}"
$
Чтобы продолжить использовать fg
команда:
$ fg
[1] + 13764 continued ruby -e "loop { puts Time.now; sleep 1}"
2013-09-11 12:38:28 +0200
2013-09-11 12:38:29 +0200
2013-09-11 12:38:30 +0200
2013-09-11 12:38:31 +0200
Смотрите http://en.wikipedia.org/wiki/Job_control_(Unix) для подробностей.
ОБНОВИТЬ
Для обработки этого сигнала в Ruby:
trap("TSTP") {
# clean up
Process.kill("STOP", Process.pid) # really stop this process
}
trap("CONT") {
# handle restart
}