mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Issue #21326: Add a new is_closed() method to asyncio.BaseEventLoop
Add BaseEventLoop._closed attribute and use it to check if the event loop was closed or not, instead of checking different attributes in each subclass of BaseEventLoop. run_forever() and run_until_complete() methods now raise a RuntimeError('Event loop is closed') exception if the event loop was closed. BaseProactorEventLoop.close() now also cancels "accept futures".
This commit is contained in:
parent
15386652bf
commit
bb2fc5b2a5
7 changed files with 80 additions and 19 deletions
|
@ -52,6 +52,20 @@ class BaseEventLoopTests(unittest.TestCase):
|
|||
gen = self.loop._make_subprocess_transport(m, m, m, m, m, m, m)
|
||||
self.assertRaises(NotImplementedError, next, iter(gen))
|
||||
|
||||
def test_close(self):
|
||||
self.assertFalse(self.loop.is_closed())
|
||||
self.loop.close()
|
||||
self.assertTrue(self.loop.is_closed())
|
||||
|
||||
# it should be possible to call close() more than once
|
||||
self.loop.close()
|
||||
self.loop.close()
|
||||
|
||||
# operation blocked when the loop is closed
|
||||
f = asyncio.Future(loop=self.loop)
|
||||
self.assertRaises(RuntimeError, self.loop.run_forever)
|
||||
self.assertRaises(RuntimeError, self.loop.run_until_complete, f)
|
||||
|
||||
def test__add_callback_handle(self):
|
||||
h = asyncio.Handle(lambda: False, (), self.loop)
|
||||
|
||||
|
|
|
@ -80,7 +80,10 @@ class BaseSelectorEventLoopTests(unittest.TestCase):
|
|||
|
||||
self.loop._selector.close()
|
||||
self.loop._selector = selector = mock.Mock()
|
||||
self.assertFalse(self.loop.is_closed())
|
||||
|
||||
self.loop.close()
|
||||
self.assertTrue(self.loop.is_closed())
|
||||
self.assertIsNone(self.loop._selector)
|
||||
self.assertIsNone(self.loop._csock)
|
||||
self.assertIsNone(self.loop._ssock)
|
||||
|
@ -89,9 +92,20 @@ class BaseSelectorEventLoopTests(unittest.TestCase):
|
|||
csock.close.assert_called_with()
|
||||
remove_reader.assert_called_with(7)
|
||||
|
||||
# it should be possible to call close() more than once
|
||||
self.loop.close()
|
||||
self.loop.close()
|
||||
|
||||
# operation blocked when the loop is closed
|
||||
f = asyncio.Future(loop=self.loop)
|
||||
self.assertRaises(RuntimeError, self.loop.run_forever)
|
||||
self.assertRaises(RuntimeError, self.loop.run_until_complete, f)
|
||||
fd = 0
|
||||
def callback():
|
||||
pass
|
||||
self.assertRaises(RuntimeError, self.loop.add_reader, fd, callback)
|
||||
self.assertRaises(RuntimeError, self.loop.add_writer, fd, callback)
|
||||
|
||||
def test_close_no_selector(self):
|
||||
ssock = self.loop._ssock
|
||||
csock = self.loop._csock
|
||||
|
@ -101,9 +115,6 @@ class BaseSelectorEventLoopTests(unittest.TestCase):
|
|||
self.loop._selector = None
|
||||
self.loop.close()
|
||||
self.assertIsNone(self.loop._selector)
|
||||
self.assertFalse(ssock.close.called)
|
||||
self.assertFalse(csock.close.called)
|
||||
self.assertFalse(remove_reader.called)
|
||||
|
||||
def test_socketpair(self):
|
||||
self.assertRaises(NotImplementedError, self.loop._socketpair)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue