Skip to content

Instantly share code, notes, and snippets.

@agronholm
Created December 29, 2019 10:32
Show Gist options
  • Save agronholm/073268b75581dd1b0cfffd870ffc2919 to your computer and use it in GitHub Desktop.
Save agronholm/073268b75581dd1b0cfffd870ffc2919 to your computer and use it in GitHub Desktop.
import asyncio
import socket
from contextlib import suppress
from pprint import pprint
async def main():
async def send_loop():
payload = b'\x00' * 1024_000
while True:
await loop.sock_sendall(client_sock, payload)
print('selector keys in the beginning:')
pprint(loop._selector._fd_to_key)
print()
serv_sock = socket.socket()
serv_sock.setblocking(False)
serv_sock.bind(('127.0.0.1', 0))
serv_sock.listen()
for _ in range(2):
client_sock = socket.socket()
client_sock.setblocking(False)
print(f'connecting fd {client_sock.fileno()} to', serv_sock.getsockname())
connect_task = loop.create_task(loop.sock_connect(client_sock, serv_sock.getsockname()))
conn, addr = await loop.sock_accept(serv_sock)
print(f'connection accepted in fd {conn.fileno()}')
await connect_task
print('connected')
# Wait for send_loop() to be blocked
send_task = loop.create_task(send_loop())
while send_task._coro.cr_await is None:
await asyncio.sleep(0)
send_task.cancel()
print('closing fd', client_sock.fileno())
client_sock.close()
conn.close()
with suppress(asyncio.CancelledError):
await send_task
print('selector keys after the client has been closed:')
pprint(loop._selector._fd_to_key)
print()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment