7

Ich habe ein kleines Programm, das alle 5 Minuten ausgeführt werden muss.Wie läuft man ein Haskell-Programm endlos nur mit Haskell?

Für jetzt habe ich Shell-Skript, das diese Aufgabe ausführen, aber ich möchte für die Benutzerfähigkeit zur Verfügung stellen, es ohne zusätzliche Skripte über Schlüssel in CLI auszuführen.

Was ist der beste Weg, dies zu erreichen?

+0

CRON, nohup oder richten Sie es als Dienst ein, der gestartet werden kann. – mikeb

+1

Was bedeutet * per Schlüssel in CLI *? –

+0

@mikeb Ich möchte es in reinem Haskell, Benutzer könnte die Zeit ändern, wie 3 min, 10min, so habe ich Schlüssel in CLI, um dies zu tun, aber nicht wissen, wie man es richtig laufen. In C konnte man 'while (1) ...' –

Antwort

9

Ich nehme an, Sie etwas wie der (mehr oder weniger Pseudo-Code) wollen werden:

import Control.Concurrent (forkIO, threadDelay) 
import Data.IORef 
import Control.Monad (forever) 

main = do 
    var <- newIORef 5000 
    forkIO (forever $ process var) 
    forever $ readInput var 

process var = do 
    doActualProcessing 

    interval <- readIORef var 
    _ <- threadDelay interval 

readInput var = do 
    newInterval <- readLn 
    writeIORef var newInterval 

Wenn Sie einige komplexere Daten aus dem Eingang Thread zu dem Verarbeitungs-Thread übergeben müssen, MVar s oder TVar s könnte eine bessere Wahl sein als IORef s.

+0

danke! Das ist, was ich gesucht habe, wusste ich nicht über 'für immer ' –

+0

@FilipvanHoft für immer Implementierung ist ziemlich straighforward, sondern nur z. 'process var' am Ende von' process' würde es auch unendlich rekursiv (also geloopt) machen. –

+1

Gründe für die Wahl von 'TVar' statt, sagen wir, 'IORef's? Gibt es im obigen Code ein Atomizitätsproblem? – chi