Използване на сигнали за прекъсване и продължаване в ruby

Имам тази програма, която качва снимки в база данни чрез 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

Как да направя това?


person PericlesTheo    schedule 11.09.2013    source източник


Отговори (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
}
person Stefan    schedule 11.09.2013
comment
един проблем, който трябва да разгледаме с горното, е какво се случва, ако спрем изпълнявания процес на HTTP заявка. Може да има последици от това естество. - person PericlesTheo; 11.09.2013
comment
@PNY Не знам, може би е повдигнато изключение. Можете да го спасите и да опитате отново. В противен случай можете да уловите сигналите, вижте моята актуализация. - person Stefan; 11.09.2013