Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 猫效应-独立效应的平行组合_Scala_Functional Programming_Scala Cats_Cats Effect - Fatal编程技术网

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]=???
在我看来,我必须选择:

  • 使用具有分叉连接模式的cats效果纤维
    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如果使用两个类型参数,您可能会对即将出现的