Created
November 13, 2016 07:47
-
-
Save njsmith/d6bb8d7fb517f6248b9fb940294d63bf to your computer and use it in GitHub Desktop.
fairness problems with the eager read/write optimization
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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