Haskell的制片人和消费者问题?

raj*_*raj 8 concurrency multithreading haskell functional-programming

我想如何在像Haskell这样的函数式编程语言中实现生产者/消费者?以及它与命令式语言有何不同?我对函数式编程语言的理解是原始的.任何帮助将不胜感激.

Don*_*art 14

使用抢占线程和通过通道传递的消息的生产者/消费者抽象:

import Data.Char
import Control.Concurrent
import Control.Concurrent.Chan

main = do
    c  <- newChan
    cs <- getChanContents c     -- a lazy stream of events from eventReader
    forkIO (producer c)          -- char producer
    consumer cs

  where
    -- thread one: the event producer
    producer c = forever $ do
        key <- getChar
        writeChan c key

    -- thread two: the lazy consumer
    consumer = mapM_ print . map shift
        where shift c | isAlpha c = chr (ord c + 1)
                           | otherwise = c
Run Code Online (Sandbox Code Playgroud)

您将在Erlang中使用类似的模型.表示使用者和生产者的线程,以及它们之间的共享消息管道,每个线程都是异步的.

  • 这个答案描述了人们如何可以解决这个问题.或者更确切地说,如何在功能上生成解决问题的命令式计算.我想知道Shiva是否在寻找纯粹的功能性解决方案. (2认同)

Nor*_*sey 6

我将补充dons一个很好的答案,这里的基础机制是一个叫做的东西MVar,它是一个值必需的并行容器.你"放"和"进入"进入和离开一个MVar.获得一个空的MVar块,就像放一个完整的一样.它同时是一种通信机制和同步机制.我相信它是由Arvind发明的Monsoon/*t项目的一部分.Nikhil和Arvind有一本很好的书,它解释了他们的平行Haskell的pH方言.许多想法已经被GHC采用,这本书非常值得一读.