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

迭代演员

我想使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

一旦期货开始,您如何杀死期货?

一旦会话关闭,如何强制休眠释放内存?

一旦线程中断,如何中断RestTemplate调用?

一旦一个已完成的线程满足条件,如何取消其他线程

一旦循环满足要求就停止检查条件

一旦满足条件,如何停止滴答功能在a帧中执行代码?

计算连续发生的次数,一旦发现值就停止

一旦DataFactory Job运行或失败,如何发送通知?

一旦触发,javascript中的函数不起作用?

一旦满足条件,如何停止python程序(在jupyter笔记本中)

一旦启动phpmyadmin XAMPP,MySQL就会停止

一旦NetLogo中的“海龟”用完了,如何停止股票行情

Kotlin协程-与Timeout异步,一旦线程用完,它将停止阻塞线程

安卓。一旦执行了可运行对象,如何停止处理程序

yacc停止执行shift && reduce一旦无法从yylex()获得更多符号

一旦某个命令终止,如何使命令执行?

一旦使用菜单,停止使div依次显示的功能

一旦达到输入文件的EOF,如何终止脚本?

一旦预期元素存在,硒停止页面加载

一旦在JList中显示了保管箱列表文件,如何停止SwingWorker?

一旦商店有数据就会触发的事件

一旦找到字典(包含在列表中)中的元素,如何停止列表中的 for 循环

一旦发生某些事情,我如何退出函数?

一旦捕获,如何从 std::exception 取回原始异常?

Selenium:一旦元素被禁用,就停止循环

一旦范围已经存在,如何显示错误?

一旦通道中有新值就杀死 goroutine

一旦网络在 RxSwift 中关闭,再次触发 api

一旦刚体碰撞脚本停止运行统一