【问题标题】:How to stop threads, once there is no more data in Chan to process?一旦 Chan 中没有更多数据要处理,如何停止线程?
【发布时间】:2017-10-03 16:14:24
【问题描述】:

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

一旦没有更多数据可以提供和消费,如何关闭分叉并返回结果?

使用TChan 可以检查通道是否为空。但是我想学,怎么用简单的Chan

我发现的大多数示例代码都只是使用forever $ getLine ...,然后从 main 开始,如果没有完成分叉,这不是问题,因为一旦 main 结束,分叉也会结束。我还没有找到一个好的消费者提供者示例,我可以从中了解如何与 Chans 合作

【问题讨论】:

  • 也许将您的数据包装在另一种类型中,例如data Message a = WorkPackage a | Done?

标签: multithreading haskell channel


【解决方案1】:

您可以像这样在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

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

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2020-09-13
    • 2020-08-26
    • 1970-01-01
    相关资源
    最近更新 更多