鍍金池/ 問答/PHP  網(wǎng)絡(luò)安全  HTML/ 如何使用workerman同時發(fā)起100個wss客戶端

如何使用workerman同時發(fā)起100個wss客戶端

需要同時發(fā)起100個wss客戶端,現(xiàn)在的做法是寫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
....

那么管理又麻煩了,比如我想看看是不是都在正常運行,我要發(fā)起100遍

php start_{num} status

如果中途增加,或者停止了一部分,我忘記了哪些停止或者哪些在開始,還得一遍一遍來檢查

請問有什么辦法來管理這100個wss客戶端嘛?

注:運行環(huán)境,非windows

回答
編輯回答
真難過

使用下面的 python 腳本,你可以輕松實現(xiàn)多開

# -*- coding: utf-8 -*-
'''
同時運行多個進(jìn)程,用法:
    python3 xx.py <進(jìn)程數(shù)量> <進(jìn)程啟動參數(shù)>


@author: 李毅
'''
import asyncio
from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter, REMAINDER


async def single(wid, cmd):
    p = await asyncio.create_subprocess_exec(*cmd)
    print('#{} pid={} 已經(jīng)啟動'.format(wid, p.pid))
    await p.communicate()
    print('#{} pid={}, 代碼={} 已經(jīng)結(jié)束'.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='進(jìn)程數(shù)')
    parser.add_argument('cmd', nargs=REMAINDER, help='命令參數(shù),例如: "sleep 30"')
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main(loop, parser.parse_args()))

舉例:同時開啟 10 個 ping -c4 baidu.com 進(jìn)程

python3 a.py 3 ping -c4 baidu.com

輸出如下

PING baidu.com (123.125.115.110) 56(84) bytes of data.
#1 pid=137 已經(jīng)啟動
#2 pid=138 已經(jīng)啟動
#0 pid=139 已經(jīng)啟動
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 已經(jīng)結(jié)束
#2 pid=138, 代碼=0 已經(jīng)結(jié)束
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 已經(jīng)結(jié)束
2017年12月16日 21:56