1. 程式人生 > >多程序完成批量任務

多程序完成批量任務

貼上一篇舊文,2015.05.14 我發表在部門週刊上的。


工作中經常會遇到一類問題:使用tshark在1000個檔案中過濾中出滿足某些規則的資料;解壓10000個壓縮檔案……

完成這些任務通常是把相應的命令寫在指令碼中,然後執行指令碼,自動完成。

但是存在一個問題:通過指令碼完成這些批量的任務,往往是序列的,一次執行一個任務,比較浪費時間,而伺服器的效能也沒有充分利用上。

讓任務在後臺執行,可以實現多個任務同時執行,但是這樣也有一個明顯的問題:併發的任務量太大,併發任務間競爭激烈,反而耗時更長。

能不能併發的完成這些任務,並能夠控制併發的數量呢?

使用python的程序池,可以輕鬆實現。

程式碼如下:

#!/usr/bin/python
from multiprocessing import Pool
from optparse import OptionParser
import os

'''excute cmds in cmd.txt
'''


def excute_cmd(cmd, msg):
    print(msg)
    os.system(cmd)


if __name__ == "__main__":
    parser = OptionParser()
    parser.add_option("-n", "--nums", dest="pn", default=10, type="int", help="max nums of process", metavar="INT")
    parser.add_option("-f", "--file", dest="filename", default="cmds.txt", help="read cmds from FILE", metavar="FILE")
    (options, args) = parser.parse_args()

    cmds = []
    with open(options.filename, 'r') as f:
        cmds = f.readlines()

    pool = Pool(processes=options.pn)
    nums = len(cmds)
    for i in range(nums):
        cmd = cmds[i].strip('\r\n')
        msg = '%d/%d: %s' % (i + 1, nums, cmd)
        pool.apply_async(excute_cmd, (cmd, msg))
    pool.close()
    pool.join()

    print("all process done.")

用法如下:

./muti_process.py -f cmds.txt -n 10

這樣將會多程序執行cmds.txt中的命令,程序數量最多為10。

特點:

  1. 這個指令碼是跨平臺的,windows和linux下都可以使用。
  2. 這個指令碼和具體執行的任務是無關的,只要將自己想要執行的命令寫到檔案中,使用這個指令碼就可以批量執行了。