一旦 Chan 中没有更多数据要处理,如何停止线程?

How to stop threads, once there is no more data in Chan to process?

我想使用 Control.Concurrent.Chan。有一个大列表,由提供者分成较小的列表。它将这些块写入通道。然后消费者从通道中读取这些块并进行处理。

一旦没有更多数据可供提供和使用,如何关闭分叉并return结果?

使用TChan可以检查频道是否为空。但是我想学习,如何使用简单的Chan

我找到的大多数示例代码只是简单地使用 forever $ getLine ...,并从 main 开始,如果一个 fork 没有完成,这不是问题,因为一旦 main 结束,forks 也会结尾。我还没有找到一个很好的消费者提供者示例,从中我可以理解如何与 Chans

一起工作

您可以像这样在 Chan 基础上设计您的频道:

newtype MChan a = MChan (Chan (Maybe a))

newMChan :: IO (MChan a)
newMChan = MChan <$> newChan

closeMChan :: MChan a -> IO ()
closeMChan (MChan c) = writeChan c Nothing

writeMChan :: MChan a -> a -> IO ()
writeMChan (MChan c) = writeChan c . Just

readMChan :: MChan a -> IO (Maybe a)
readMChan (MChan c) = readChan c

因此,您可以关闭通道,消费者将一无所获,这将是停止线程的信号。