Skip to content

Commit d6c67e7

Browse files
jlaine1st1
authored andcommitted
Make Server an asynchronous context manager (fixes: #221)
The Server class was missing __aenter__ and __aexit__ magic methods to allow usage of the form: async with server: await server.serve_forever()
1 parent c7802b4 commit d6c67e7

File tree

2 files changed

+18
-7
lines changed

2 files changed

+18
-7
lines changed

Diff for: tests/test_tcp.py

+9-7
Original file line numberDiff line numberDiff line change
@@ -393,14 +393,16 @@ async def start_server():
393393
loop=self.loop,
394394
start_serving=False)
395395

396-
fut = asyncio.ensure_future(srv.serve_forever(), loop=self.loop)
397-
await asyncio.sleep(0, loop=self.loop)
398-
self.assertTrue(srv.is_serving())
396+
async with srv:
397+
fut = asyncio.ensure_future(srv.serve_forever(),
398+
loop=self.loop)
399+
await asyncio.sleep(0, loop=self.loop)
400+
self.assertTrue(srv.is_serving())
399401

400-
fut.cancel()
401-
with self.assertRaises(asyncio.CancelledError):
402-
await fut
403-
self.assertFalse(srv.is_serving())
402+
fut.cancel()
403+
with self.assertRaises(asyncio.CancelledError):
404+
await fut
405+
self.assertFalse(srv.is_serving())
404406

405407
self.loop.run_until_complete(start_server())
406408

Diff for: uvloop/server.pyx

+9
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,15 @@ cdef class Server:
4848

4949
# Public API
5050

51+
@cython.iterable_coroutine
52+
async def __aenter__(self):
53+
return self
54+
55+
@cython.iterable_coroutine
56+
async def __aexit__(self, *exc):
57+
self.close()
58+
await self.wait_closed()
59+
5160
def __repr__(self):
5261
return '<%s sockets=%r>' % (self.__class__.__name__, self.sockets)
5362

0 commit comments

Comments
 (0)