如何仅使用Haskell编写一个无限运行的Haskell程序?

7

我有一个小程序,需要每5分钟执行一次。

现在,我有一个shell脚本来执行这个任务,但是我希望通过在CLI中键入密钥来为用户提供无需额外脚本运行的能力。

最好的方法是什么?


CRON,nohup或将其设置为可以启动的服务。 - mikeb
1
via key in CLI” 是什么意思? - Bartek Banachewicz
@mikeb 我想要用纯 Haskell 实现,用户可能会更改时间,比如 3 分钟、10 分钟,所以我在 CLI 中设置了键来实现,但不知道如何正确运行它。在 C 中,你可以使用 while(1) ... - Filip van Hoft
@BartekBanachewicz ./app -e -t 5e键表示无限运行,t表示时间间隔。 - Filip van Hoft
@FilipvanHoft,你是想要一个CLI线程来进行设置,另一个线程用于程序本身吗?还是你会重新启动程序?"无限运行"是什么意思?你是想启动应用程序一次,然后允许更改处理间隔吗? - Bartek Banachewicz
@BartekBanachewicz CLI在第一次运行时设置。我如何运行具有无限逻辑的线程? - Filip van Hoft
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

如果你需要将一些更复杂的数据从输入线程传递到处理线程,MVarTVar可能比IORef更好.


谢谢!这正是我在寻找的,我不知道forever - Filip van Hoft
@FilipvanHoft的实现非常简单,但是在process的末尾仅调用例如process var将使其无限递归(因此循环)。 - Bartek Banachewicz
1
选择TVar而不是IORef的原因是什么?上面的代码中是否存在一些原子性问题? - chi
1
我简直忘记了它们。我几乎从不使用“原始”的IORef,但是当然所示的代码没有可能的竞争条件。我会进行编辑。 - Bartek Banachewicz
1
我不确定为什么你会使用IORefTVar。直接将5000传递给进程即可。 - Rein Henrichs
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接