我有一个for循环,其中调用了函数task
。每次对该函数的调用都会返回一个附加到数组的字符串。我想并行处理此for循环。我尝试使用&
,但似乎不起作用。
这是未并行化的代码。
task (){ sleep 1;echo "hello $1"; }
arr=()
for i in {1..3}; do
arr+=("$(task $i)")
done
for i in "${arr[@]}"; do
echo "$i x";
done
输出为:
hello 1 x
hello 2 x
hello 3 x
太好了!但是现在,当我尝试将其与
并行化时[...]
for i in {1..3}; do
arr+=("$(task $i)")&
done
wait
[...]
输出为空。
答案 0 :(得分:3)
GNU并行擅长并行处理:-)
task (){ sleep 1;echo "hello $1"; }
# Make "task" known to sub shells
export -f task
# Do tasks in parallel
parallel -k task ::: {1..3}
示例输出
hello 1
hello 2
hello 3
我建议您这样做-但查尔斯(Charles)友善指出,这是一个已知的bash
陷阱:
array=( $(parallel -k task ::: {1..3}) )
查尔斯建议的解决方案是:
IFS=$'\n' read -r -d '' -a array < <(parallel -k task ::: 1 2 3 && printf '\0')
答案 1 :(得分:0)
尝试将添加步骤封装到函数或临时脚本中,但是将项目发送到文件中。我认为您将需要一些我不记得的命令来处理文件锁定。看看您是否也需要导出内容。然后,在最后获取文件。像这样:
constructor(public appServices:AppServices) {
this.rowData = this.assayDataList;
this.columnDefs = [
{
//headerCheckboxSelection: true,
//headerCheckboxSelectionFilteredOnly: true,
checkboxSelection: true,
width: 40,
headerComponentParams: CustomheaderComponent
},
{
headerName: "Date/Time",
field: "createdDate",
width: 230
},
{headerName: 'Assay Name', field: 'assayName', width: 240},
{headerName: 'Samples', field: 'sampleCount', width: 100}
];
this.gridOptions = {
rowSelection: 'multiple',
cacheBlockSize: 30,
//maxBlocksInCache: 2,
enableServerSideFilter: false,
enableServerSideSorting: false,
rowModelType: 'infinite',
paginationAutoPageSize: true,
suppressRowClickSelection: true
//suppressCellSelection: true
};
this.frameworkComponents = { agColumnHeader: CustomheaderComponent };
}
答案 2 :(得分:0)
您正在寻找parset
(自20170422起成为GNU Parallel的一部分)或env_parset
(自20171222起可用):
# If you have not run:
# env_parallel --install
# and logged in again, then you can instead run this to activate (env_)parset:
. `which env_parallel.bash`
task (){
echo "hello $1"
sleep 1.$1
perl -e 'print "binary\001\002\n"'
sleep 1.$1
echo output of parallel jobs do not mix
}
env_parset arr task ::: {1..3}
env_parset a,b,c task ::: {1..3}
echo "${arr[1]}" | xxd
echo "$b" | xxd
Bash / Ksh / Zsh(包括数组),ash /破折号(不包含数组)支持 parset
。
答案 3 :(得分:-2)
尝试将添加步骤封装到函数或临时脚本中。看看您是否也需要导出内容。像这样:
add() { arr+=(value); }
...
export -f add
...
add &