bash – 同步Unix池化进程的简单机制是什么?
我需要限制并行执行的进程数.例如,我想执行这个伪命令行:
export POOL_PARALLELISM=4 for i in `seq 100` ; do pool foo -bar & done pool foo -bar # would not complete until the first 100 finished. 因此,尽管排队等待运行的101个foos,但在任何给定时间只有4个运行. pool会fork()/ exit()并将剩余的进程排队直到完成. 使用Unix工具有一个简单的机制吗? at和batch不适用,因为它们通常在分钟的顶部调用以及按顺序执行作业.使用队列不一定是最好的,因为我想要这些同步. 在我编写一个使用信号量和共享内存的C包装器然后调试我肯定会介绍的死锁之前,任何人都可以推荐一个bash / shell或其他工具机制来实现这一点. 解决方法
绝对没有必要自己编写这个工具,有几个不错的选择.
使 make可以很容易地做到这一点,但它确实广泛依赖于文件来驱动这个过程. (如果要对生成输出文件的每个输入文件运行某些操作,这可能很棒.)-j命令行选项将运行指定数量的任务,-l load-average命令行选项将指定在开始新任务之前必须满足的系统负载平均值. (如果你想在后台做一些工作,这可能会很好.不要忘记nice(1)命令,这也可以帮到这里.) 因此,一个快速(和未经测试)的Makefile用于图像转换: ALL=$(patsubst cimg%.jpg,thumb_cimg%.jpg,$(wildcard *.jpg)) .PHONY: all all: $(ALL) convert $< -resize 100x100 $@ 如果你用make运行它,它将一次运行一次.如果你使用make -j8运行,它将运行八个单独的作业.如果你运行make -j,它将启动数百个. (在编译源代码时,我发现核心数量的两倍是一个很好的起点.这样可以在等待磁盘IO请求时为每个处理器做些事情.不同的机器和不同的负载可能会有不同的工作方式.) xargs的 xargs提供了–max-procs命令行选项.如果并行处理可以基于单个输入流与ascii NUL分离输入命令或新行分离输入命令分开,则这是最好的. (好吧,-d选项允许你选择其他东西,但这两个很常见且很简单.)这给你带来了使用find(1)强大的文件选择语法的好处,而不是像上面的Makefile例子那样编写有趣的表达式,或让您的输入与文件完全无关. (考虑一下你是否有一个程序来计算素数因子中的大型复合数字 – 使得该任务适合制作最好是尴尬.xargs可以很容易地做到.) 前面的示例可能如下所示: find . -name '*jpg' -print0 | xargs -0 --max-procs 16 -I {} convert {} --resize 100x100 thumb_{} 平行 moreutils包(至少在Ubuntu上可用)提供并行命令.它可以以两种不同的方式运行:在不同的参数上运行指定的命令,或者并行运行不同的命令.前面的示例可能如下所示: parallel -i -j 16 convert {} -resize 100x100 thumb_{} -- *.jpg beanstalkd
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- angular6学习(一):用webStorm创建第一个项目
- 第2节 Scala中面向对象编程:9、getClass和classOf;10、调
- angularjs-$interval
- bootstrap-4 – Bootstrap 4导航栏垂直不水平出现
- RxJS和AngularJS HTTP – 我该如何实现?
- twitter-bootstrap – 如何使Bootstrap手风琴在点击标题div
- WebService专业术语以及入门程序
- bash – 使用set -e,是否可以忽略某些命令的错误?
- 利用docker搭建php7和nginx运行环境全过程(官方镜像)
- Axis1.4 在weblogic9.2中报 (401)Unauthorized 的处理