2013-06-22 24 views
5

Chciałbym wygłaszać spekulacje w spekulacjach, mając nadzieję na (choć nieoczekiwany) wynik. Mój kod ma twardy limit czasowy. Czy istnieje prosty sposób na uruchomienie kodu rakietowego przez kilka sekund, a następnie niezawodne zabicie go i wykonanie kodu awaryjnego przed upływem terminu?Nici do biegania rakietowego przez ustalony czas

Odpowiedz

5

Tak, prostym sposobem na to jest korzystanie z biblioteki engine. Na przykład:

#lang racket 

(require racket/engine) 

(define e (engine 
      (λ (_) 
      ;; just keep printing every second 
      (let loop() 
       (displayln "hi") 
       (sleep 1) 
       (loop))))) 

;; run only for 2 seconds 
(engine-run 2000 e) 

Zamiast określania czasu, można również określić przedmiot event tak, że wątek przestanie działać, gdy zdarzenie wyzwala.

+0

Czyż nie jesteśmy urocze z odpowiedziami umieszczonymi jednocześnie? :) Poważnie, nawet nie wiedziałem o "rakiecie/silniku", to jest miłe. –

3

Możesz stworzyć wątek "pracowniczy" do wykonania pracy i kolejny wątek "watcher", aby zabić pracownika.

Opisano to w sekcji Dokumenty w sekcji More: Systems Programming.

Najprostszym, pierwsze cięcie może być wystarczające dla obliczenia:

(define (accept-and-handle listener) 
    (define-values (in out) (tcp-accept listener)) 
    (define t (thread 
       (lambda() 
       (handle in out) 
       (close-input-port in) 
       (close-output-port out)))) 
    ; Watcher thread: 
    (thread (lambda() 
      (sleep 10) 
      (kill-thread t)))) 

Jednak jeśli masz do czynienia z innymi zasobami czytaj dalej, aby dowiedzieć się o opiekunów.

+0

W tej metodzie, jaki jest najlepszy sposób, aby zwrócić wynik pierwszego wątku do głównego wątku? (wątek-wysyłanie) wydaje się nieco niezgrabny, wszystko, czego chcę, to coś takiego (thread-wait t), które blokuje na ti zwraca wynik. Czy istnieje prosty sposób na zrobienie tego? – So8res

+0

Dobra uwaga. Możesz spróbować ['channel'] (http://docs.racket-lang.org/reference/channel.html) - zlecić robotowi' channel-put' normalny wynik, mieć watcher 'channel-put' wynik limitu czasu i główny wątek powoduje, że 'channel-get' czeka na to, co nastąpi wcześniej. –