<div dir="ltr"><div><div><div><div><div><div>Hello, <br><br></div>I'm experimenting with asyncio. I have composed the following code. There is a server handler and a client handler. I didn't want to split the code into two files so I just used a socketpair, inspired by example <a href="https://docs.python.org/3/library/asyncio-stream.html#register-an-open-socket-to-wait-for-data-using-streams">https://docs.python.org/3/library/asyncio-stream.html#register-an-open-socket-to-wait-for-data-using-streams</a> . However, my code doesn't work – it blocks because both sides are trying to read more data. But if I close the writer on one side (the commented line), whole connection is closed. So<br><br></div>1) is there a way to close just one direction of the connection?<br></div>2) In the blocked situaction even KeyboardInterrupt doesn't break the loop, is that desired behavior? And why?<br></div>3) Are there some other issues with my code with respect to “best practices” how to write a code like this?<br><br></div>Here is the code:<br><br>import asyncio<br>import socket<br><br>async def server(reader, writer):<br>    print("starting server")<br>    <br>    request = (await reader.read()).decode()<br>    print("got request {!r}".format(request))<br>    <br>    response = "RESPONSE"<br>    writer.write(response.encode())<br>    print("response sent")<br><br>async def client(reader, writer):<br>    print("starting client")<br>    <br>    request = "REQUEST"<br>    writer.write(request.encode())<br>    # writer.close()<br>    print("request sent")<br>    <br>    response = (await reader.read()).decode()<br>    print("got response {!r}".format(response))<br><br>async def connect(loop):<br>    serversock, clientsock = socket.socketpair()<br>    reader, writer = await asyncio.open_connection(sock=serversock, loop=loop)<br>    server_coro = server(reader, writer)<br>    reader, writer = await asyncio.open_connection(sock=clientsock, loop=loop)<br>    client_coro = client(reader, writer)<br>    <br>    server_task = loop.create_task(server_coro)<br>    client_task = loop.create_task(client_coro)<br>    <br>    return client_task<br><br>loop = asyncio.get_event_loop()<br>task = loop.run_until_complete(connect(loop))<br>loop.run_until_complete(task)<br><br><br></div>Thank you, Adam Bartoš<br></div>