2015-10-13 40 views
7

我有一個小程序需要每5分鐘執行一次。如何僅使用Haskell無休止地運行Haskell程序?

現在,我有執行該任務的shell腳本,但我希望爲用戶提供運行它的能力,無需通過CLI中的鍵添加其他腳本。

達到此目的的最佳方法是什麼?

+0

CRON,nohup或將其設置爲可啓動的服務。 – mikeb

+1

CLI *中的* via key是什麼意思? –

+0

@mikeb我想要它在純粹的Haskell中,用戶可能會改變時間,如3分鐘,10分鐘,所以我在CLI中有鍵來做到這一點,但不知道如何正確運行它。在C中,你可以'while'(1)...' –

回答

9

我想你會想這樣的事情(或多或少僞代碼):

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 

如果您需要從輸入線傳遞一些更復雜的數據處理線程,MVar S或TVar小號可能是比IORef更好的選擇。

+0

謝謝!這就是我一直在尋找的東西,我不知道'永遠' –

+0

@FilipvanHoft永遠的實現非常直接,但只是調用例如'process'結尾的'process var'會使它無限遞歸(因此循環)。 –

+1

選擇「TVAR」而不是「IORef」的原因是什麼?上面的代碼中是否有一些原子性問題? – chi