前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shell 多线程及线程数控制实现

shell 多线程及线程数控制实现

作者头像
PedroQin
发布2020-07-28 15:37:27
1.2K0
发布2020-07-28 15:37:27
举报
文章被收录于专栏:WriteSimpleDemoWriteSimpleDemo

生成测试文件,模拟多个任务

代码语言:javascript
复制
[root@centos76 parallel]# for i in {1..10};do echo $i >> example.txt;done

单进程

代码语言:javascript
复制
[root@centos76 parallel]# cat parallel_run.sh 
#!/bin/bash

file_name=${1:?we need a parameter!}
if [ ! -f "$file_name" ];then
    echo "Can't find the file $file_name !"
    exit 1
fi
while read ;do
    {
        echo $REPLY
        sleep 1
    }
done < $file_name
echo done

运行:

代码语言:javascript
复制
[root@centos76 parallel]# time ./parallel_run.sh example.txt 
1
2
......
9
10
done

real 0m10.114s
user 0m0.030s
sys 0m0.071s

多进程

&实现多进程,wait实现父进程等待子进程完成后退出

代码语言:javascript
复制
[root@centos76 parallel]# cat parallel_run.sh 
#!/bin/bash

file_name=${1:?we need a parameter!}
if [ ! -f "$file_name" ];then
    echo "Can't find the file $file_name !"
    exit 1
fi
while read ;do
    {
        echo $REPLY
        sleep 1
    } &
done < $file_name
wait
echo done

运行,数字全部一起输出,耗时1s:

代码语言:javascript
复制
[root@centos76 parallel]# time ./parallel_run.sh example.txt 
6
7
2
3
4
8
9
10
5
1
done

real 0m1.024s
user 0m0.011s
sys 0m0.012s

通过管道控制进程数

代码语言:javascript
复制
[root@centos76 parallel]# cat parallel_run.sh 
#!/bin/bash

file_name=${1:?we need a parameter!}
if [ ! -f "$file_name" ];then
    echo "Can't find the file $file_name !"
    exit 1
fi

thread_num=4
# create pipe
[ ! -p tmp ] && mkfifo tmp
exec 9<>tmp

# fill in the pipe
for ((i=0;i<thread_num;i++)); do
    echo 1>&9
done

while read ;do
    # remove one line per thread
    (read -u 9) # In order to avoid the "read" command in while loop, we use the parentheses here
    {
        echo $REPLY
        sleep 1
        # thread run finish, put line back
        echo 1>&9
    } &
done < $file_name
wait
echo done

运行如下,数字四个一组输出,共三组,耗时3s:

代码语言:javascript
复制
[root@centos76 parallel]# time ./parallel_run.sh example.txt 
1
2
3
4
5
6
7
8
9
10
done

real 0m3.019s
user 0m0.014s
sys 0m0.019s

另辟蹊径,通过xargs控制进程数

代码语言:javascript
复制
[root@centos76 parallel]# cat parallel_run.sh 
#!/bin/bash

whereami=`cd $(dirname $0); pwd`
file_name=${1:?we need a parameter!}
if [ ! -f "$file_name" ];then
    echo "Can't find the file $file_name !"
    exit 1
fi

thread_num=4

cat $file_name |xargs -n 1 -I {} -P ${thread_num} sh -c "$whereami/print.sh {}"
echo done

[root@centos76 parallel]# cat print.sh 
#!/bin/bash

echo $* 
sleep 1

运行如下,数字四个一组输出,共三组,耗时3s:

代码语言:javascript
复制
[root@centos76 parallel]# time ./parallel_run.sh example.txt 
1
2
3
4
5
6
8
7
9
10
done

real 0m3.033s
user 0m0.033s
sys 0m0.024s
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WriteSimpleDemo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 生成测试文件,模拟多个任务
  • 单进程
  • 多进程
  • 通过管道控制进程数
  • 另辟蹊径,通过xargs控制进程数
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档