class TestIdent(greentest.TestCase): def setUp(self): self.reg = IdentRegistry() def tearDown(self): self.reg = None def test_basic(self): target = Target() self.assertEqual(0, self.reg.get_ident(target)) self.assertEqual(1, len(self.reg)) self.assertEqual(0, self.reg.get_ident(target)) self.assertEqual(1, len(self.reg)) target2 = Target() self.assertEqual(1, self.reg.get_ident(target2)) self.assertEqual(2, len(self.reg)) self.assertEqual(1, self.reg.get_ident(target2)) self.assertEqual(2, len(self.reg)) self.assertEqual(0, self.reg.get_ident(target)) # When an object dies, we can re-use # its id. Under PyPy we need to collect garbage first. del target if PYPY: for _ in range(3): gc.collect() self.assertEqual(1, len(self.reg)) target3 = Target() self.assertEqual(1, self.reg.get_ident(target2)) self.assertEqual(0, self.reg.get_ident(target3)) self.assertEqual(2, len(self.reg)) @greentest.skipOnPyPy("This would need to GC very frequently") def test_circle(self): keep_count = 3 keepalive = [None] * keep_count for i in range(1000): target = Target() # Drop an old one. keepalive[i % keep_count] = target self.assertLessEqual(self.reg.get_ident(target), keep_count)
def ident_registry(self): return IdentRegistry()
return _threadlocal.hub def set_hub(hub): _threadlocal.hub = hub def _config(default, envvar): result = os.environ.get(envvar) or default # absolute import gets confused pylint: disable=no-member if isinstance(result, string_types): return result.split(',') return result hub_ident_registry = IdentRegistry() class Hub(RawGreenlet): """ A greenlet that runs the event loop. It is created automatically by :func:`get_hub`. .. rubric:: Switching Every time this greenlet (i.e., the event loop) is switched *to*, if the current greenlet has a ``switch_out`` method, it will be called. This allows a greenlet to take some cleanup actions before yielding control. This method should not call any gevent blocking functions. """
def setUp(self): self.reg = IdentRegistry()