2013-09-11 3 views
1

У меня есть эта программа, которая загружает фотографии в базу данных через api. Однако для обработки и загрузки всех этих изображений требуется довольно много времени, и я хочу, чтобы можно было остановить и возобновить процесс в произвольные моменты времени. Я думал, что прерывание и продолжение сигналов могут быть хорошим (временным!) Решением для этого.Использование сигналов прерывания и продолжения в ruby ​​

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 

Как это сделать?

ответ

3

Вам не нужно ничего делать в Ruby для отправки сигналов SIGTSTP и SIGCONT.

Чтобы остановить бегущий процесс просто ударил управления + 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) подробности.

UPDATE

Чтобы справиться с этим сигналы в Ruby:

trap("TSTP") { 
    # clean up 
    Process.kill("STOP", Process.pid) # really stop this process 
} 
trap("CONT") { 
    # handle restart 
} 
+0

один вопрос, чтобы рассмотреть с выше, является то, что если мы happends остановить запущенный процесс на запрос HTTP. Это может иметь последствия такого характера. – PericlesTheo

+0

@PNY Я не знаю, возможно, возникает исключение. Вы могли бы спасти его и повторить попытку. В противном случае вы можете захватить сигналы, см. Мое обновление. – Stefan

Смежные вопросы