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

多進程完成批量任務

file 執行cmd lose ESS 性能 __main__ line block inux

貼上一篇舊文,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. 這個腳本和具體執行的任務是無關的,只要將自己想要執行的命令寫到文件中,使用這個腳本就可以批量執行了。

多進程完成批量任務