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

时间:2016-02-27 06:11:44

标签: parallel-processing clojurescript

假设我有N个对象和M个操作(其中一些正在进行网络I / O)。我想为每个N个对象调用操作序列,但在可能的情况下允许并行(跨对象)。在操作M-1中,管道中有一个同步(扇入)点。在core.async中执行此操作的最佳/最简单方法是什么? [另外,这是在ClojureScript中,因此vector<string> numbers; string str; string x; getline (cin, str); stringstream ss(str); while (ss >> x){ numbers.push_back(x); } if (numbers.size()==1){ cout << numbers[0] << endl; return 0; } vector<int> results(numbers.size()); for (int i=0;i<numbers.size();i++){ char *a=new char[numbers[i].size()+1]; a[numbers[i].size()]=0; memcpy(a,numbers[i].c_str(),numbers[i].size()); if(isdigit(*a)==0) { results[i]=1; } else{ results[i]=0; } } int j=0; while (j<numbers.size()){ int k=j+1; while (k<numbers.size()){ while (results[j]==results[k]){ sort(numbers.begin()+j,numbers.begin()+k+1); k++; } j=k; k=numbers.size(); } if(j==numbers.size()){ for (int i=0; i<numbers.size();i++){ cout << numbers[i] << " "; } j++; } } 不是一个选项。)

2 个答案:

答案 0 :(得分:0)

猫的组合&#39; aletpromesa/promise&amp; promesa/all会做到这一点。

这里是代码(有精益):

(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."))))))

operation-m0operation-m1operation-m2,&amp; final-operation应该是立即返回承诺的函数,并且在结果可用时resolve承诺。

答案 1 :(得分:0)

也许您可以使用core.async/pipeline-async将函数异步应用于通道中的元素,将调用结果按照与输入相同的顺序放入通道。这是一个example