gpt4 book ai didi

scala - 猫效应——独立效应的平行组合

转载 作者:行者123 更新时间:2023-12-03 03:46:51 25 4
gpt4 key购买 nike

我想组合多个应独立并行运行的 IO 值。

val io1: IO[Int] = ???
val io2: IO[Int] = ???

据我所知,我必须选择:

  1. 使用具有叉状连接图案的猫效应纤维
    val parallelSum1: IO[Int] = for {
    fiber1 <- io1.start
    fiber2 <- io2.start
    i1 <- fiber1.join
    i2 <- fiber2.join
    } yield i1 + i2
  2. Parallel 实例与 parMapN 一起用于 IO(或其同级实例​​之一,如 parTraverseparSequenceparTupled 等)
    val parallelSum2: IO[Int] = (io1, io2).parMapN(_ + _)

不确定每种方法的优缺点,以及我何时应该选择一种方法。当抽象效果类型 IO(tagless-final 样式)时,这变得更加棘手:

def io1[F[_]]: F[Int] = ???
def io2[F[_]]: F[Int] = ???

def parallelSum1[F[_]: Concurrent]: F[Int] = for {
fiber1 <- io1[F].start
fiber2 <- io2[F].start
i1 <- fiber1.join
i2 <- fiber2.join
} yield i1 + i2

def parallelSum2[F[_], G[_]](implicit parallel: Parallel[F, G]): F[Int] =
(io1[F], io2[F]).parMapN(_ + _)

Parallel 类型类需要 2 个类型构造函数,因此使用起来有些麻烦,没有上下文边界,并且带有附加的模糊类型参数 G[_]

感谢您的指导:)

阿米泰

最佳答案

I want to combine multiple IO values that should run independently in parallel.

在我看来,为了弄清楚“我什么时候使用哪个?”,我们需要返回旧的 parallel vs concurrent discussion ,基本上可以归结为(引用已接受的答案):

Concurrency is when two or more tasks can start, run, and complete in overlapping time periods. It doesn't necessarily mean they'll ever both be running at the same instant. For example, multitasking on a single-core machine.

Parallelism is when tasks literally run at the same time, e.g., on a multicore processor.

当我们进行类似 IO 的操作时,例如创建线上调用或与磁盘对话,我们经常喜欢提供并发示例。

问题是,当你说要“并行”执行时,你想要哪一个,是前者还是后者?

如果我们指的是前者,那么使用 Concurrent[F] 既可以通过签名传达意图,也可以提供正确的执行语义。如果是后者,例如,我们想要并行处理元素集合,那么使用 Parallel[F, G] 将是更好的解决方案。

当我们思考关于IO的语义时,常常会感到非常困惑,因为它同时具有ParallelConcurrent的实例,并且我们主要用它来不透明地定义副作用操作。

顺便说一句,Parallel 采用两个一元类型构造函数的原因是 M (在 Parallel[M[_] 中, F[_]])总是在一个 Monad 实例中,并且我们需要一种方法来证明 Monad 也有一个 Applicative[F] 实例以进行并行执行,因为当我们想到 Monad 时,我们总是谈论顺序执行语义。

关于scala - 猫效应——独立效应的平行组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54169385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com