假设我有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++;
}
}
不是一个选项。)
答案 0 :(得分:0)
猫的组合&#39; alet
,promesa/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-m0
,operation-m1
,operation-m2
,&amp; final-operation
应该是立即返回承诺的函数,并且在结果可用时resolve
承诺。
答案 1 :(得分:0)
也许您可以使用core.async/pipeline-async将函数异步应用于通道中的元素,将调用结果按照与输入相同的顺序放入通道。这是一个example。