码迷,mamicode.com
首页 > 系统相关 > 详细

多进程完成批量任务

时间:2018-11-10 18:06:11      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:help   代码   int   []   任务   pen   通过   multi   5.0   

贴上一篇旧文,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. 这个脚本和具体执行的任务是无关的,只要将自己想要执行的命令写到文件中,使用这个脚本就可以批量执行了。

多进程完成批量任务

标签:help   代码   int   []   任务   pen   通过   multi   5.0   

原文地址:https://www.cnblogs.com/parody/p/9939845.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!