日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bash多进程

發(fā)布時間:2025/3/21 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bash多进程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在bash中,使用后臺任務(wù)來實現(xiàn)任務(wù)的“多進程化”。在不加控制的模式下,不管有多少任務(wù),全部都后臺執(zhí)行。也就是說,在這種情況下,有多少任務(wù)就有多少“進程”在同時執(zhí)行。我們就先實現(xiàn)第一種情況:

實例一:正常情況腳本

1 2 3 4 5 6 7 8 9 10 #!/bin/bash for ((i=0;i<5;i++));do ???????{ ???????????????sleep 3;echo 1>>aa && echo "done!" ???????} done wait cat aa|wc -l rm aa

這種情況下,程序順序執(zhí)行,每個循環(huán)3s,共需15s左右。

1 2 3 4 5 6 7 8 9 10 11 $ time bash test.sh done! done! done! done! done! 5 real??? 0m15.030s user??? 0m0.002s sys???? 0m0.003s

實例二:“多進程”實現(xiàn)

1 2 3 4 5 6 7 8 9 10 #!/bin/bash for ((i=0;i<5;i++));do ????????{ ????????????????sleep 3;echo 1>>aa && echo "done!" ????????} & done wait cat aa|wc -l rm aa

這個實例實際上就在上面基礎(chǔ)上多加了一個后臺執(zhí)行&符號,此時應(yīng)該是5個循環(huán)任務(wù)并發(fā)執(zhí)行,最后需要3s左右時間。

1 2 3 4 5 6 7 8 9 10 11 $ time bash test.sh done! done! done! done! done! 5 real??? 0m3.011s user??? 0m0.002s sys???? 0m0.004s

效果非常明顯。

這里需要說明一下wait的左右。wait是等待前面的后臺任務(wù)全部完成才往下執(zhí)行,否則程序本身是不會等待的,這樣對后面依賴前面任務(wù)結(jié)果的命令來說就可能出錯。例如上面wc -l的命令就報錯:不存在aa這個文件。

wait命令的官方解釋如下:

1 2 wait [n] ???????Wait for the specified process and return its termination status.? n may be a process ID or? a? job? specification; if a job spec is given, all processes in that job's pipeline are waited for.? If n is not given, all currently active child processes are waited for, and the return status is zero.? If? n? specifies? a? non-existent process? or job, the return status is 127.? Otherwise, the return status is the exit status of the last processor job waited for.

以上所講的實例都是進程數(shù)目不可控制的情況,下面描述如何準確控制并發(fā)的進程數(shù)目。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 #!/bin/bash # 2006-7-12, by wwy #----------------------------------------------------------------------------------- # 此例子說明了一種用wait、read命令模擬多線程的一種技巧 # 此技巧往往用于多主機檢查,比如ssh登錄、ping等等這種單進程比較慢而不耗費cpu的情況 # 還說明了多線程的控制 #----------------------------------------------------------------------------------- function a_sub { # 此處定義一個函數(shù),作為一個線程(子進程) sleep 3 # 線程的作用是sleep 3s } tmp_fifofile="/tmp/$$.fifo" mkfifo $tmp_fifofile????? # 新建一個fifo類型的文件 exec 6<>$tmp_fifofile????? # 將fd6指向fifo類型 rm $tmp_fifofile thread=15 # 此處定義線程數(shù) for ((i=0;i<$thread;i++));do echo done >&6 # 事實上就是在fd6中放置了$thread個回車符 for ((i=0;i<50;i++));do # 50次循環(huán),可以理解為50個主機,或其他 read -u6 # 一個read -u6命令執(zhí)行一次,就從fd6中減去一個回車符,然后向下執(zhí)行, # fd6中沒有回車符的時候,就停在這了,從而實現(xiàn)了線程數(shù)量控制 { # 此處子進程開始執(zhí)行,被放到后臺 ??????a_sub && { # 此處可以用來判斷子進程的邏輯 ???????echo "a_sub is finished" ??????} || { ???????echo "sub error" ??????} ??????echo >&6 # 當進程結(jié)束以后,再向fd6中加上一個回車符,即補上了read -u6減去的那個 } & done wait # 等待所有的后臺子進程結(jié)束 exec 6>&- # 關(guān)閉df6 exit 0

結(jié)束任務(wù):

1 pstree -ap 3471|grep -oP '[0-9]{3,6}'|xargs kill -9

sleep 3s,線程數(shù)為15,一共循環(huán)50次,所以,此腳本一共的執(zhí)行時間大約為12秒

即:

1 2 3 4 5 6 7 8 9 15x3=45, 所以 3 x 3s = 9s (50-45=5)<15, 所以 1 x 3s = 3s 所以 9s + 3s = 12s $ time ./multithread.sh >/dev/null real??????? 0m12.025s user??????? 0m0.020s sys???????? 0m0.064s

而當不使用多線程技巧的時候,執(zhí)行時間為:50 x 3s = 150s。

此程序中的命令

1 mkfifo tmpfile

和linux中的命令

1 mknod tmpfile p

效果相同。區(qū)別是mkfifo為POSIX標準,因此推薦使用它。該命令創(chuàng)建了一個先入先出的管道文件,并為其分配文件標志符6。管道文件是進程之間通信的一種方式,注意這一句很重要

1 exec 6<>$tmp_fifofile????? # 將fd6指向fifo類型

如果沒有這句,在向文件$tmp_fifofile或者&6寫入數(shù)據(jù)時,程序會被阻塞,直到有read讀出了管道文件中的數(shù)據(jù)為止。而執(zhí)行了上面這一句后就可以在程序運行期間不斷向fifo類型的文件寫入數(shù)據(jù)而不會阻塞,并且數(shù)據(jù)會被保存下來以供read程序讀出。

原文:http://www.cnitblog.com/sysop/archive/2008/11/03/50974.aspx

總結(jié)

以上是生活随笔為你收集整理的bash多进程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。