我对Haskell编程感兴趣,但我想创建一个作业池系统,我想知道这是否会成为Haskell中的一个问题。
以下是Ruby中的一个简单程序。在一个执行线程中,从用户获取单词并将其添加到列表中。在另一个帖子中,单词从列表中获取并以某种方式处理(在这种情况下,反转并打印回用户)。
words = []
# Create new thread to take words from array, one at a time, and process them
t = Thread.new {
loop do
unless words.empty?
word = words.pop
break if word == 'quit'
sleep 1
puts word.reverse
end
end
}
# Take words from user and add to array
loop do
puts "Enter word:"
word = gets.chomp
words << word
break if word == 'quit'
end
t.join
等效的Haskell代码是什么?
答案 0 :(得分:3)
这是一个非常接近的翻译。
Chan
是用于在Haskell线程之间传递消息的FIFO队列。
下面我使用MVar
等待假脱机程序退出。这就像一个常规的可变变量,但它是用互斥锁保护的。它可以为空(仅允许put
,take
等待)或已满(仅允许take
,put
等待。)
我也使用下面的Haskell线程,它们可能在不同的OS级别线程上运行--Haskell运行时选择它。与OS线程相比,Haskell线程非常便宜。
参见例如Real World Haskell进行更多讨论。
{-# OPTIONS -Wall #-}
module JobPool where
import Control.Monad (when)
import Control.Concurrent
spooler :: Chan String -> MVar () -> IO ()
spooler ch stop = do
word <- readChan ch
if word == "quit"
then putMVar stop ()
else do
threadDelay 1000000 -- us
putStrLn (reverse word)
spooler ch stop
main :: IO ()
main = do
stop <- newEmptyMVar
ch <- newChan
_ <- forkIO $ spooler ch stop
let loop = do
word <- getLine
writeChan ch word
when (word /= "quit") loop
loop
takeMVar stop