Scala 猫效应-独立效应的平行组合
我想组合多个应该独立并行运行的Scala 猫效应-独立效应的平行组合,scala,functional-programming,scala-cats,cats-effect,Scala,Functional Programming,Scala Cats,Cats Effect,我想组合多个应该独立并行运行的IO值 val io1:IO[Int]=??? val io2:IO[Int]=??? 在我看来,我必须选择: 使用具有分叉连接模式的cats效果纤维 val parallelSum1:IO[Int]=for{ 纤维1 我想组合多个IO值,这些值应在中独立运行 平行 在我看来,为了弄清楚“我什么时候使用哪个?”我们需要返回旧的,基本上可以归结为(引用公认的答案): 并发是指两个或多个任务可以在同一时间启动、运行和完成 重叠的时间段。这并不一定意味着它们会 两者都可
IO
值
val io1:IO[Int]=???
val io2:IO[Int]=???
在我看来,我必须选择:
val parallelSum1:IO[Int]=for{
纤维1
我想组合多个IO值,这些值应在中独立运行
平行
在我看来,为了弄清楚“我什么时候使用哪个?”我们需要返回旧的,基本上可以归结为(引用公认的答案):
并发是指两个或多个任务可以在同一时间启动、运行和完成
重叠的时间段。这并不一定意味着它们会
两者都可以在同一时刻运行。例如,在计算机上执行多任务
单芯机
并行性是指任务实际上在同一时间运行,例如在
多核处理器
在执行类似IO的操作时,我们通常喜欢提供一个并发性示例,例如创建有线呼叫或与磁盘对话
问题是,当你说你想“并行”执行时,你想要哪一个,是前者还是后者
如果我们指的是前者,那么使用Concurrent[F]
通过签名传达意图并提供适当的执行语义。如果是后者,例如,我们希望并行处理一组元素,那么使用parallel[F,G]
将是更好的解决方案
当我们思考关于IO
的语义时,通常会感到非常困惑,因为它同时具有并行
和并发
两个实例,并且我们主要使用它来不透明地定义副作用操作
作为旁注,Parallel
采用两个一元类型构造函数背后的原因是M
(在Parallel[M[\uu],F[\u]]
中)总是在Monad
实例中,我们需要一种方法来证明Monad具有Applicative[F]
并行执行的实例,因为当我们想到Monad时,我们总是谈论顺序执行语义。嗨,Yuval,谢谢你的回答。我知道并发和并行之间的区别,但仍然不确定每种方法的优缺点,它们似乎实现了相似的语义。关于关于Parallel[M[\uu],F[\uz]的注记
-我仍然不完全理解F
的作用……我知道有一个计划,在版本2中创建一个单一类型参数Parallel
typeclass,类似于这里提供的临时解决方案:@amitayh TBH,Monix任务和cats的并发和并行实例<代码>IO
实现在封面下是完全相同的。我认为除了语义之外,你不会发现有什么深刻的区别。我认为这提供了一个很好的解释。并行
似乎是一种能力,可以像结构化数据类型一样配对,其中一个是Monad,另一个是Applicative(即要么->验证)。文档中根本没有谈到并行性。@amitayh:and。似乎Parallel
既可以用于运行并行计算,也可以在monad和它们各自的应用程序实例之间来回移动,因为这些应用程序能够并行执行Parallel
requ如果使用两个类型参数,您可能会对即将出现的