Skip to content

Instantly share code, notes, and snippets.

@njsmith
Created November 13, 2016 07:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save njsmith/d6bb8d7fb517f6248b9fb940294d63bf to your computer and use it in GitHub Desktop.
Save njsmith/d6bb8d7fb517f6248b9fb940294d63bf to your computer and use it in GitHub Desktop.
fairness problems with the eager read/write optimization
import curio
received = 0
async def send(sock):
while True:
await sock.sendall(b"x" * 100000)
async def recv(sock):
global received
while True:
received += len(await sock.recv(100000))
async def report():
global received
while True:
await curio.sleep(1)
print("Received {} bytes total".format(received))
async def main():
sock = await curio.open_connection("localhost", 25000)
await curio.spawn(send(sock))
await curio.spawn(recv(sock))
await curio.spawn(report())
curio.run(main())
# A simple echo server, + instrumentation to detect event loop starvation
import time
from curio import run, tcp_server
from curio.socket import IPPROTO_TCP, TCP_NODELAY
last_addr = None
last_switch_loops = 0
last_switch_time = None
async def echo_handler(client, addr):
print('Connection from', addr)
client.setsockopt(IPPROTO_TCP, TCP_NODELAY, 1)
while True:
global last_addr, last_switch_time, last_switch_loops
if last_addr is not addr:
now = time.time()
if last_switch_time is not None:
print("Switched after {} loops ({:.1f} ms)"
.format(last_switch_loops,
1000 * (now - last_switch_time)))
last_switch_time = now
last_switch_loops = 0
last_addr = addr
last_switch_loops += 1
data = await client.recv(1000000)
if not data:
break
await client.sendall(data)
print('Connection closed')
if __name__ == '__main__':
run(tcp_server('', 25000, echo_handler))
With two copies of aggressive-echo-client.py running:
$ python instrumented-echo-server.py
Connection from ('127.0.0.1', 36824)
Connection from ('127.0.0.1', 37024)
Switched after 2143 loops (1070.5 ms)
Switched after 9 loops (6.2 ms)
Switched after 44 loops (19.0 ms)
Switched after 12 loops (9.9 ms)
Switched after 99 loops (16.9 ms)
Switched after 28 loops (17.2 ms)
Switched after 58 loops (28.2 ms)
Switched after 10 loops (6.3 ms)
Switched after 56 loops (28.1 ms)
Switched after 28 loops (13.5 ms)
Switched after 45 loops (26.3 ms)
Switched after 27 loops (13.7 ms)
Switched after 24 loops (15.4 ms)
Switched after 31 loops (16.9 ms)
Switched after 17 loops (11.0 ms)
Switched after 38 loops (16.7 ms)
Switched after 10 loops (4.6 ms)
Switched after 10 loops (4.4 ms)
Switched after 9 loops (3.9 ms)
Switched after 24 loops (7.4 ms)
Switched after 46 loops (21.0 ms)
Switched after 10 loops (4.6 ms)
Switched after 29 loops (15.9 ms)
Switched after 20 loops (8.9 ms)
Switched after 32 loops (15.5 ms)
Switched after 10 loops (6.2 ms)
Switched after 35 loops (16.7 ms)
Switched after 22 loops (13.6 ms)
Switched after 12 loops (4.9 ms)
Switched after 121 loops (56.0 ms)
Switched after 10 loops (4.9 ms)
Switched after 14 loops (5.7 ms)
Switched after 46 loops (22.8 ms)
Switched after 10 loops (5.1 ms)
Switched after 10 loops (4.4 ms)
Switched after 11 loops (5.7 ms)
Switched after 12 loops (6.8 ms)
Switched after 23 loops (13.2 ms)
Switched after 24 loops (13.3 ms)
Switched after 30 loops (16.2 ms)
Switched after 22 loops (12.7 ms)
Switched after 30 loops (13.7 ms)
Switched after 19 loops (12.0 ms)
Switched after 48 loops (22.2 ms)
Switched after 21 loops (12.9 ms)
Switched after 20 loops (9.0 ms)
Switched after 10 loops (6.0 ms)
Switched after 19 loops (11.2 ms)
Switched after 22 loops (12.6 ms)
Switched after 36 loops (16.4 ms)
Switched after 23 loops (14.3 ms)
Switched after 44 loops (19.5 ms)
Switched after 24 loops (15.4 ms)
Switched after 30 loops (14.8 ms)
Switched after 24 loops (14.9 ms)
Switched after 53 loops (26.4 ms)
Switched after 25 loops (14.6 ms)
Switched after 58 loops (29.5 ms)
Switched after 24 loops (12.6 ms)
Switched after 12 loops (4.6 ms)
Switched after 20 loops (11.3 ms)
Switched after 17 loops (9.4 ms)
Switched after 29 loops (13.9 ms)
Switched after 10 loops (8.0 ms)
Switched after 29 loops (13.8 ms)
Switched after 15 loops (6.5 ms)
Switched after 12 loops (5.4 ms)
Switched after 71 loops (35.9 ms)
Switched after 24 loops (15.2 ms)
Switched after 38 loops (17.5 ms)
Switched after 22 loops (16.8 ms)
Switched after 17 loops (9.2 ms)
Switched after 37 loops (27.8 ms)
Switched after 10 loops (7.5 ms)
Switched after 27 loops (19.3 ms)
Switched after 26 loops (18.9 ms)
Switched after 31 loops (21.2 ms)
Switched after 21 loops (15.5 ms)
Switched after 22 loops (16.4 ms)
Switched after 21 loops (15.1 ms)
Switched after 19 loops (12.5 ms)
Switched after 22 loops (18.1 ms)
Switched after 16 loops (7.9 ms)
Switched after 5 loops (4.2 ms)
Switched after 153 loops (86.6 ms)
Switched after 24 loops (15.7 ms)
Switched after 24 loops (10.9 ms)
Switched after 10 loops (9.6 ms)
Switched after 18 loops (9.9 ms)
Switched after 22 loops (13.3 ms)
Switched after 29 loops (15.8 ms)
Switched after 25 loops (14.0 ms)
Switched after 44 loops (23.0 ms)
Switched after 27 loops (16.6 ms)
Switched after 27 loops (13.5 ms)
Switched after 24 loops (13.4 ms)
Switched after 29 loops (15.4 ms)
Switched after 23 loops (13.5 ms)
Switched after 39 loops (19.3 ms)
Switched after 23 loops (14.0 ms)
Switched after 49 loops (25.2 ms)
Switched after 26 loops (11.9 ms)
Switched after 47 loops (23.9 ms)
Switched after 26 loops (15.2 ms)
Switched after 36 loops (17.8 ms)
Switched after 25 loops (14.8 ms)
Switched after 28 loops (14.9 ms)
Switched after 22 loops (13.5 ms)
Switched after 42 loops (19.1 ms)
Switched after 24 loops (14.4 ms)
Switched after 47 loops (22.0 ms)
Switched after 24 loops (15.6 ms)
Switched after 40 loops (18.2 ms)
Switched after 24 loops (15.6 ms)
Switched after 39 loops (17.6 ms)
Switched after 24 loops (15.5 ms)
Switched after 26 loops (12.0 ms)
Switched after 22 loops (14.4 ms)
Switched after 24 loops (13.0 ms)
Switched after 29 loops (12.5 ms)
Switched after 20 loops (10.3 ms)
Switched after 5 loops (2.7 ms)
Switched after 13 loops (6.4 ms)
Switched after 14 loops (4.0 ms)
Switched after 8 loops (3.0 ms)
Switched after 5 loops (1.9 ms)
Switched after 13 loops (5.8 ms)
Switched after 5 loops (3.5 ms)
Switched after 20 loops (10.2 ms)
Switched after 10 loops (5.9 ms)
Switched after 63 loops (28.8 ms)
Switched after 26 loops (12.7 ms)
Switched after 10 loops (4.5 ms)
Switched after 8 loops (4.9 ms)
Switched after 7 loops (3.0 ms)
Switched after 10 loops (6.3 ms)
Switched after 10 loops (4.4 ms)
Switched after 17 loops (7.3 ms)
Switched after 13 loops (5.6 ms)
Switched after 10 loops (6.5 ms)
Switched after 220 loops (100.7 ms)
Switched after 10 loops (6.4 ms)
Switched after 40 loops (18.5 ms)
Switched after 21 loops (14.9 ms)
Switched after 43 loops (19.6 ms)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment