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
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.
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.
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
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. –
Czyż nie jesteśmy urocze z odpowiedziami umieszczonymi jednocześnie? :) Poważnie, nawet nie wiedziałem o "rakiecie/silniku", to jest miłe. –