哈斯克尔工作池

时间:2017-03-04 16:10:03

标签: multithreading haskell jobs

我对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代码是什么?

1 个答案:

答案 0 :(得分:3)

这是一个非常接近的翻译。

Chan是用于在Haskell线程之间传递消息的FIFO队列。

下面我使用MVar等待假脱机程序退出。这就像一个常规的可变变量,但它是用互斥锁保护的。它可以为空(仅允许puttake等待)或已满(仅允许takeput等待。)

我也使用下面的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