展会信息港展会大全

shell里实现‘多线程’
来源:互联网   发布日期:2015-08-20 21:04:54   浏览:1531次  

导读: 即比如我有100个可执行文件,互相间没有特别的先后执行关系,如 CODE: job_1 job_2 job_2 ..... job_100 想用csh/bash来多线程调用执行 比如一次开5个线程,那么job_1,2,3,4,5一起先开始,那么其中任何一个线程如果先执行完成,则继续执行下一个没有初执行过...

即比如我有100个可执行文件,互相间没有特别的先后执行关系,如

CODE:

job_1job_2job_2.....job_100想用csh/bash来多线程调用执行比如一次开5个线程,那么job_1,2,3,4,5一起先开始,那么其中任何一个线程如果先执行完成,则继续执行下一个没有初执行过的文件,如job_6,7,8....,这样一直以所指定的线程数来执行所有100个文件。我本来想用 "&" 来放入后台,可是这样我一次可以指定5放入后台,但是无法知道其中任何一个程序何时执行完毕,所以也无法继续执行下一个程序啊!

完美解决方案

-(dearvoid@LinuxEden:Forum)-(~/tmp)-

[$$$$=6718 $$?=0] ; cat job_1

#!/bin/bash

n=$$((RANDOM % 5 + 1))

echo "$$0 sleeping for $$n seconds ..."

sleep $$n

echo "$$0 exiting ..."

-(dearvoid@LinuxEden:Forum)-(~/tmp)-

[$$$$=6718 $$?=0] ; for ((i = 2; i <= 10; ++i)); do cp job_1 job_$$i; done

-(dearvoid@LinuxEden:Forum)-(~/tmp)-

[$$$$=6718 $$?=0] ; cat jobs.sh

#!/bin/bash

nParellel=5

nJobs=10

sJobPattern='./job_%d'

aJobs=()

sNextJob=

for ((iNextJob = 1; iNextJob <= nJobs; )); do

for ((iJob = 0; iJob < nParellel; ++iJob)); do

if [ $$iNextJob -gt $$nJobs ]; then

break;

fi

if [ ! "$${aJobs[iJob]}" ] || ! kill -0 $${aJobs[iJob]} 2> /dev/null; then

printf -v sNextJob "$$sJobPattern" $$((iNextJob++))

echo "$$sNextJob starting ..."

$$sNextJob &

aJobs[iJob]=$$!

fi

done

sleep .1

done

wait

-(dearvoid@LinuxEden:Forum)-(~/tmp)-

[$$$$=6718 $$?=0] ; ./jobs.sh

./job_1 starting ...

./job_1 sleeping for 3 seconds ...

./job_2 starting ...

./job_2 sleeping for 2 seconds ...

./job_3 starting ...

./job_3 sleeping for 5 seconds ...

./job_4 starting ...

./job_5 starting ...

./job_4 sleeping for 4 seconds ...

./job_5 sleeping for 2 seconds ...

./job_2 exiting ...

./job_6 starting ...

./job_6 sleeping for 2 seconds ...

./job_5 exiting ...

./job_7 starting ...

./job_7 sleeping for 1 seconds ...

./job_1 exiting ...

./job_8 starting ...

./job_8 sleeping for 3 seconds ...

./job_7 exiting ...

./job_9 starting ...

./job_9 sleeping for 5 seconds ...

./job_4 exiting ...

./job_6 exiting ...

./job_10 starting ...

./job_10 sleeping for 5 seconds ...

./job_3 exiting ...

./job_8 exiting ...

./job_9 exiting ...

./job_10 exiting ...

-(dearvoid@LinuxEden:Forum)-(~/tmp)-

[$$$$=6718 $$?=0] ; bye

赞助本站

人工智能实验室

相关热词: shell 实现 线程 比如 我有

相关内容
AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港