是否可以设置一个 -halt 条件(或多个 -halt 条件?),以便无论退出代码如何,如果其中任何一个作业失败,所有作业都将停止?
我想监视一个事件(我刚刚在负载平衡服务上单独触发)。我可以通过查看日志来确定事件是通过还是失败,但我必须同时查看多个服务器上的日志。完美的!平行吧!不过,我有一个额外的要求:我想根据日志结果返回成功或失败。
因此,如果并行作业中的任何一个检测到事件(即"-halt now"),我想停止并行作业,但我不知道检测是否会返回零或非零(这就是重点:我正在尝试找出该信息),所以两者"--halt now,success=1"都不"--halt now,fail=1"正确,我需要找出一种方法来做类似的事情"--halt now,any=1")
我查看了源代码,嗯,我的 perl 功夫不足以解决这个问题(看起来 exitstatus 在源代码的许多不同地方使用,所以我很难弄清楚这是否可行或不。)
请注意,,success=1两者,fail=1都工作得很好(给定相应的退出状态),但我不知道在并行运行之前它会成功还是失败。
截至目前,我使用时间并行来并行运行脚本。示例...首先,我将转到脚本所在的目录。
cd $DIR
Run Code Online (Sandbox Code Playgroud)
然后,执行脚本
time parallel ::: $script1 $script2 $script3
Run Code Online (Sandbox Code Playgroud)
这效果很好。
但是如果脚本位于不同的目录中怎么办?
使用--pipe -N<int>I 可以发送给定数量的行作为由 启动的作业的输入parallel。:::但是我怎样才能运行多个作业,并在每个块上给出不同的参数呢?
让我们看一下这个小输入文件:
A B C
D E F
G H I
J K L
Run Code Online (Sandbox Code Playgroud)
此外,我们定义将每两行通过管道传输到一个parallel作业。cut -f<int>在它们上,应该使用作为并行输入参数给出的列号来执行命令,例如::: {1..3}
因此对于给定的示例,输出将如下所示
A
D
B
E
C
F
G
J
H
K
I
L
Run Code Online (Sandbox Code Playgroud)
我尝试过这个命令:
cat input.txt|parallel --pipe -N2 'cut -f{1}' ::: {1..3}
Run Code Online (Sandbox Code Playgroud)
但输出是这样的:
A
D
I
L
Run Code Online (Sandbox Code Playgroud)
我缺少什么?
鳍游泳者
从例子
seq 1 100 | parallel -I @@ \ > 'mkdir top-@@;seq 1 100 | parallel -X mkdir top-@@/sub-{}
Run Code Online (Sandbox Code Playgroud)
怎么-X , @@, {}工作?此外,'1' 或 '.' 时的行为是什么?在 {} 内传递?/> 用于重定向吗?
我试图通过https://www.youtube.com/watch?v=P40akGWJ_gY&list=PL284C9FF2488BC6D1&index=2阅读教程并阅读 man 并行页面。我能够收集一些基本知识,但不知道如何使用它等。
我想解压多个文件,
使用此答案,我找到了以下命令。
find -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;
如何通过上述命令使用 GNU Parallel 解压缩多个文件?
编辑 1:根据用户Mark Setchell提出的问题
文件在哪里?
所有的 zip 文件通常都在一个目录中。
但是,根据我的假设,该命令会根据 find 命令中给出的深度递归/非递归地查找所有文件。
文件是如何命名的?
abcd_sdfa_fasfasd_dasd14.zip
你通常如何解压缩一个?
unzip abcd_sdfa_fasfasd_dasd14.zip -d abcd_sdfa_fasfasd_dasd14
我想在几个输入上运行几个长时间运行的进程。例如:
solver_a problem_1
solver_b problem_1
...
solver_b problem_18
solver_c problem_18
Run Code Online (Sandbox Code Playgroud)
我知道如何为同一个命令运行多个参数——这是核心用例。这更像是相反的情况:同一参数的多个命令。
当然,您始终可以并行运行多个实例 - 但是在调度资源时,这些实例是否位于同一台机器上或同一用户下?
我正在尝试实现以下目标,并且希望使用GNU并行在多个进程上实现。
for i in $(seq 0 3); do
var=$(printf "%.5d" $i)
echo test_$var
done
Output:
--------------------
test_00000
test_00001
test_00002
Run Code Online (Sandbox Code Playgroud)
我尝试了这个,但是它不起作用:
parallel var=$(print "%.5d" {})\; echo test_$var ::: $(seq 0 3)
Run Code Online (Sandbox Code Playgroud) 在我的代码中的某些时候,我必须对unordered_map中的所有元素进行操作.为了加速这个过程,我想使用openMP,但天真的方法不起作用:
std::unordered_map<size_t, double> hastTable;
#pragma omp for
for(auto it = hastTable.begin();
it != hastTable.end();
it ++){
//do something
}
Run Code Online (Sandbox Code Playgroud)
原因是,unordered_map的迭代器不是随机访问迭代器.作为替代方案,我尝试了使用for_each的__gnu_parallel指令.但是下面的代码
#include <parallel/algorithm>
#include <omp.h>
__gnu_parallel::for_each (hashTable.begin(), hashTable.end(),[](std::pair<const size_t, double> & item)
{
//do something with item.secon
});
Run Code Online (Sandbox Code Playgroud)
编译(gcc 4.8.2)
g++ -fopenmp -march=native -std=c++11
Run Code Online (Sandbox Code Playgroud)
没有并行运行.使用向量切换unordered_map并使用相同的__gnu_parallel指令并行运行.
为什么在无序地图的情况下不能并行运行?有变通方法吗?
在下面我给你一些简单的代码,它可以重现我的问题.
#include <unordered_map>
#include <parallel/algorithm>
#include <omp.h>
int main(){
//unordered_map
std::unordered_map<size_t, double> hashTable;
double val = 1.;
for(size_t i = 0; i<100000000; i++){
hashTable.emplace(i, val);
val += 1.;
}
__gnu_parallel::for_each (hashTable.begin(), hashTable.end(),[](std::pair<const size_t, double> & …Run Code Online (Sandbox Code Playgroud) 我有一个for循环,在100个不同的输入文件夹上运行一个Python脚本~100次.python脚本在2个内核上最有效,我有50个内核可用.所以我想使用GNU parallel一次在25个文件夹上运行脚本.
这是我的for循环(工作正常,但当然是顺序的),python脚本需要一堆输入变量,包括-p 2在两个核心上运行它:
for folder in $(find /home/rob/PartitionFinder/ -maxdepth 2 -type d); do
python script.py --raxml --quick --no-ml-tree $folder --force -p 2
done
Run Code Online (Sandbox Code Playgroud)
这是我尝试并行化它,这是行不通的:
folders=$(find /home/rob/PartitionFinder/ -maxdepth 2 -type d)
echo $folders | parallel -P 25 python script.py --raxml --quick --no-ml-tree {} --force -p 2
Run Code Online (Sandbox Code Playgroud)
我遇到的问题(也许它只是众多的第一个)是我的folders变量不是一个列表,所以它实际上只是传递一个长100个文件夹的字符串作为{}脚本.
感谢所有提示.
我可以看到在多个输入上运行并行作业有多么容易,但是没有其他方法可以通过将命令放入文件并重复多次来并行运行同一作业多次?
parallel -j+0 ::: './dosomejob.sh'
Run Code Online (Sandbox Code Playgroud)
但是告诉并行使用可用核的数量并行运行该作业x次数?