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