我想使用Control.Concurrent.Chan。有一个很大的列表,它被提供者分成更小的列表。它将此块写入通道。然后消费者从通道读取这些块并处理它们。
一旦没有更多数据可供提供和消费,如何关闭分叉并返回结果?
有了TChan
它,可以检查通道是空的。但我想学习,如何使用简单Chan
我发现的大多数示例代码只是使用forever $ getLine ...
, 并从 main 开始它,这不是问题,如果 fork 没有完成,因为一旦 main 结束,fork 也将结束。我还没有找到一个好的消费者提供者的例子,从中我可以理解,如何与 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
因此,您可以关闭通道,消费者将一无所获,它将成为停止线程的信号。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句