Concurrency writeChan会覆盖或排队
RWH手册中规定了以下内容: 如果Concurrency writeChan会覆盖或排队,concurrency,haskell,Concurrency,Haskell,RWH手册中规定了以下内容: 如果Chan为空,readChan将阻塞,直到有一个值要读取。 writeChan函数从不阻塞:它将新值写入Chan 马上 我不清楚的是,调用writeChan是否会覆盖已存在的消息(假设某些消息尚未读取),或者它是否会按正确的顺序将消息排队,以便未读消息不会丢失?它会排队Chan是一个通道,消息可以在其中排队。相比之下,MVar可以只取一个值,作为变量而不是队列Chan是一个通道,消息可以在其中排队。相比之下,MVar可以只取一个值,表现为变量而不是队列。我不打算
Chan
为空,readChan
将阻塞,直到有一个值要读取。
writeChan
函数从不阻塞:它将新值写入Chan
马上
我不清楚的是,调用
writeChan
是否会覆盖已存在的消息(假设某些消息尚未读取),或者它是否会按正确的顺序将消息排队,以便未读消息不会丢失?它会排队Chan
是一个通道,消息可以在其中排队。相比之下,MVar
可以只取一个值,作为变量而不是队列Chan
是一个通道,消息可以在其中排队。相比之下,MVar
可以只取一个值,表现为变量而不是队列。我不打算将此作为答案发布,因为我不是100%确定这是正确的,但我的理解是,Chan
基本上是一个队列,你将数据推到一边,然后从另一边出来。你可以很容易地测试这个。我建议大家看看Simon Marlow在Haskell的书中所写的并行和并发编程,我记得他介绍了MVar
s和Chan
s的实现,除此之外,你还可以看看这个实现,它只有几行代码,对于懒惰的人来说非常聪明:我不打算把它作为一个答案,因为我不是100%确定这是正确的,但我的理解是,Chan
基本上是一个队列,你把数据推到一边,它从另一边出来。你可以很容易地测试这个。我建议你看看Simon Marlow在Haskell的书中所写的并行和并发编程,我记得他在书中介绍了MVar
s和Chan
s的实现,以及其他一些东西。你也可以看看这个实现,它只有几行,对于懒惰的人来说非常聪明: