Created
December 29, 2019 10:32
-
-
Save agronholm/073268b75581dd1b0cfffd870ffc2919 to your computer and use it in GitHub Desktop.
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 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