如何使用workerman同时发起100个wss客户端

李惟
  • 2.1k

需要同时发起100个wss客户端,现在的做法是写100个start文件,类似

php start_1.php start
php start_2.php start
php start_3.php start
php start_4.php start
php start_5.php start
....

那么管理又麻烦了,比如我想看看是不是都在正常运行,我要发起100遍

php start_{num} status

如果中途增加,或者停止了一部分,我忘记了哪些停止或者哪些在开始,还得一遍一遍来检查

请问有什么办法来管理这100个wss客户端嘛?

注:运行环境,非windows

回复
阅读 2.9k
1 个回答

使用下面的 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 已经结束
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏