tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

clients.py (1569B)


      1 #!/usr/bin/env python
      2 
      3 import asyncio
      4 import statistics
      5 import sys
      6 import time
      7 
      8 import websockets
      9 
     10 
     11 LATENCIES = {}
     12 
     13 
     14 async def log_latency(interval):
     15    while True:
     16        await asyncio.sleep(interval)
     17        p = statistics.quantiles(LATENCIES.values(), n=100)
     18        print(f"clients = {len(LATENCIES)}")
     19        print(
     20            f"p50 = {p[49] / 1e6:.1f}ms, "
     21            f"p95 = {p[94] / 1e6:.1f}ms, "
     22            f"p99 = {p[98] / 1e6:.1f}ms"
     23        )
     24        print()
     25 
     26 
     27 async def client():
     28    try:
     29        async with websockets.connect(
     30            "ws://localhost:8765",
     31            ping_timeout=None,
     32        ) as websocket:
     33            async for msg in websocket:
     34                client_time = time.time_ns()
     35                server_time = int(msg[:19].decode())
     36                LATENCIES[websocket] = client_time - server_time
     37    except Exception as exc:
     38        print(exc)
     39 
     40 
     41 async def main(count, interval):
     42    asyncio.create_task(log_latency(interval))
     43    clients = []
     44    for _ in range(count):
     45        clients.append(asyncio.create_task(client()))
     46        await asyncio.sleep(0.001)  # 1ms between each connection
     47    await asyncio.wait(clients)
     48 
     49 
     50 if __name__ == "__main__":
     51    try:
     52        count = int(sys.argv[1])
     53        interval = float(sys.argv[2])
     54    except Exception as exc:
     55        print(f"Usage: {sys.argv[0]} count interval")
     56        print("    Connect <count> clients e.g. 1000")
     57        print("    Report latency every <interval> seconds e.g. 1")
     58        print()
     59        print(exc)
     60    else:
     61        asyncio.run(main(count, interval))