使用下面的 python 脚本,你可以轻松实现多开
# -*- coding: utf-8 -*-
'''
同时运行多个进程,用法:
python3 xx.py
@author: 李毅
'''
import asyncio
from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter, REMAINDER
async def single(wid, cmd):
p = await asyncio.create_subprocess_exec(*cmd)
print('#{} pid={} 已经启动'.format(wid, p.pid))
await p.communicate()
print('#{} pid={}, 代码={} 已经结束'.format(wid, p.pid, p.returncode))
async def main(loop, args):
if not args.worker or not len(args.cmd):
return
ps = [single(i, args.cmd) for i in range(args.worker)]
return await asyncio.gather(*ps)
if __name__ == '__main__':
parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter)
parser.add_argument('worker', type=int, help='进程数')
parser.add_argument('cmd', nargs=REMAINDER, help='命令参数,例如: "sleep 30"')
loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop, parser.parse_args()))
举例:同时开启 10 个 ping -c4 baidu.com 进程
python3 a.py 3 ping -c4 baidu.com
输出如下
PING baidu.com (123.125.115.110) 56(84) bytes of data.
#1 pid=137 已经启动
#2 pid=138 已经启动
#0 pid=139 已经启动
PING baidu.com (220.181.57.216) 56(84) bytes of data.
PING baidu.com (123.125.115.110) 56(84) bytes of data.
64 bytes from 123.125.115.110 (123.125.115.110): icmp_seq=1 ttl=52 time=38.0 ms
64 bytes from 220.181.57.216 (220.181.57.216): icmp_seq=1 ttl=55 time=36.3 ms
64 bytes from 123.125.115.110 (123.125.115.110): icmp_seq=1 ttl=52 time=38.0 ms
64 bytes from 123.125.115.110 (123.125.115.110): icmp_seq=2 ttl=52 time=37.9 ms
64 bytes from 220.181.57.216 (220.181.57.216): icmp_seq=2 ttl=55 time=36.2 ms
64 bytes from 123.125.115.110 (123.125.115.110): icmp_seq=2 ttl=52 time=37.6 ms
64 bytes from 123.125.115.110 (123.125.115.110): icmp_seq=3 ttl=52 time=37.9 ms
64 bytes from 220.181.57.216 (220.181.57.216): icmp_seq=3 ttl=55 time=36.1 ms
64 bytes from 123.125.115.110 (123.125.115.110): icmp_seq=3 ttl=52 time=37.8 ms
64 bytes from 123.125.115.110 (123.125.115.110): icmp_seq=4 ttl=52 time=37.9 ms
--- baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 37.916/37.955/38.024/0.199 ms
64 bytes from 220.181.57.216 (220.181.57.216): icmp_seq=4 ttl=55 time=36.1 ms
--- baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 36.113/36.218/36.374/0.254 ms
#1 pid=137, 代码=0 已经结束
#2 pid=138, 代码=0 已经结束
64 bytes from 123.125.115.110 (123.125.115.110): icmp_seq=4 ttl=52 time=37.7 ms
--- baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 37.647/37.818/38.060/0.249 ms
#0 pid=139, 代码=0 已经结束