2011-01-01 9 views
6

Wdrażam system kontroli w Ruby. Uruchamia pliki wykonywalne z różnymi testami. Jeśli rozwiązanie nie jest poprawne, ukończenie niektórych twardych testów może trwać wiecznie. Dlatego chcę ograniczyć czas wykonania do 5 sekund.Jak wyjść z procesu z Ruby, jeśli trwa to więcej niż 5 sekund?

Mam systemu function() do uruchamiania plików wykonywalnych przy użyciu:

system("./solution"); 

NET ma wielką WaitForExit() metodę, co o Ruby ?.

Czy istnieje sposób ograniczenia czasu realizacji procesu zewnętrznego do 5 sekund?

Dzięki

Odpowiedz

11

Można użyć standardowej biblioteki limitu czasu, tak jak poniżej:

require 'timeout' 
Timeout::timeout(5) { system("./solution") } 

W ten sposób nie będziesz musiał martwić się o błędy synchronizacji.

+0

Dzięki, działa świetnie – Alex

+0

Wybrałem to jako akceptowaną odpowiedź, ponieważ w przeciwieństwie do rozwiązania EnabrenTane, każdy test nie trwa do 5 sekund. Używam systemu ("sudo killall solution"), aby zabić uruchomiony proces. – Alex

4

Widelec dziecko, który wykonuje „./solution”, sen, sprawdzić, czy jej zrobić, jeśli nie go zabić. To powinno zacząć.

pid = Process.fork{ system("./solution")} 
sleep(5) 
Process.kill("HUP", pid) 

http://www.ruby-doc.org/core/classes/Process.html#M003153

+0

Dzięki za link. Widzę, że mogę użyć metody widelca. Ale jak mogę połączyć to z systemem ("./ rozwiązanie")? – Alex

+1

@Alex, zaktualizowane, powinno być bardziej pomocne. – EnabrenTane

+0

Dziękuję bardzo! Dokładnie tego potrzebuję. Jest tylko jeden problem. Teraz wszystkie testy trwają 5 sekund. Jednak większość testów jest przekazywana w mniej niż sekundę. Czy istnieje sposób, aby to naprawić? – Alex

Powiązane problemy