多進程完成批量任務
阿新 • • 發佈:2018-11-10
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。
特點:
- 這個腳本是跨平臺的,windows和linux下都可以使用。
- 這個腳本和具體執行的任務是無關的,只要將自己想要執行的命令寫到文件中,使用這個腳本就可以批量執行了。
多進程完成批量任務