Parallel processing 如何在N个对象上并行M个顺序操作(带同步点)

Parallel processing 如何在N个对象上并行M个顺序操作(带同步点),parallel-processing,clojurescript,Parallel Processing,Clojurescript,假设我有N个对象和M个操作(其中一些正在进行网络I/O)。我想为N个对象中的每一个调用操作序列,但在可能的情况下允许并行(跨对象)。管道中有一个同步(扇入)点,比如在M-1操作中。在core.async中执行此操作的最佳/最简单的方法是什么?[此外,这在ClojureScript中,因此线程不是一个选项)。猫的alet,promesa/promise和promesa/all的组合就可以了 以下是代码(带省略号): operation-m0,operation-m1,operation-m2,&f

假设我有N个对象和M个操作(其中一些正在进行网络I/O)。我想为N个对象中的每一个调用操作序列,但在可能的情况下允许并行(跨对象)。管道中有一个同步(扇入)点,比如在M-1操作中。在core.async中执行此操作的最佳/最简单的方法是什么?[此外,这在ClojureScript中,因此
线程
不是一个选项)。

猫的
alet
promesa/promise
promesa/all
的组合就可以了

以下是代码(带省略号):


operation-m0
operation-m1
operation-m2
,&
final operation
应该是在结果可用时立即返回承诺并
解析承诺的函数。

也许您可以使用它将函数异步应用于通道中的元素,并放置调用结果以与输入相同的顺序输入通道。下面是一个。

操作是否可以是接收和返回数字的函数?对象是否可以是数字?是否像是您所追求的结果矩阵?是否希望操作/函数按顺序进行,以便例如并行执行第一个函数(许多同时工作)在每个对象/数字上?不确定“扇入”点-我希望有某种“处理程序”只获取所有对象和操作。可能是@muhuk Nope的重复,而不是重复。@chrismurphy这些操作是异步web请求(例如).我在原始请求中指定了所需的顺序和并行操作的类型。是否有不清楚的地方?'Fan in'==同步点;即,在该点上跨N个对象的所有操作必须完成,然后才能对该点之后的其余操作进行处理(在UNIX术语中也称为“join”)。此链接无效,我建议您发布代码并标记问题已解决。
(ns example
  (:require [[cats.context :as ctx :include-macros true]
            [cats.core :as m :include-macros true]
            [promesa.monad :as pm]
            [promesa.core :as p :include-macros true]]))

(defn foo []
  (ctx/with-context pm/promise-context
    (let [last-stage (fn [obj] (final-operation obj)) ;; could be chain a la first-stage
          first-stage (fn [obj]
                        (p/chain
                         (operation-m0 args)
                         (partial operation-m1 some-args)
                         (partial operation-m2 some-more-args)))
          first-stage-results (p/all (mapv first-stage objects))]
      (p/then (m/alet [_ (p/then first-stage-results global-operation-requiring-fan-in)
                       z (p/all (mapv last-stage objects))] z)
              (fn [_] (.info logger "Finished all operations."))))))