fail_initialstub_already_started.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. """
  2. Testing initialstub throwing an already started exception.
  3. """
  4. import greenlet
  5. a = None
  6. b = None
  7. c = None
  8. main = greenlet.getcurrent()
  9. # If we switch into a dead greenlet,
  10. # we go looking for its parents.
  11. # if a parent is not yet started, we start it.
  12. results = []
  13. def a_run(*args):
  14. #results.append('A')
  15. results.append(('Begin A', args))
  16. def c_run():
  17. results.append('Begin C')
  18. b.switch('From C')
  19. results.append('C done')
  20. class A(greenlet.greenlet): pass
  21. class B(greenlet.greenlet):
  22. doing_it = False
  23. def __getattribute__(self, name):
  24. if name == 'run' and not self.doing_it:
  25. assert greenlet.getcurrent() is c
  26. self.doing_it = True
  27. results.append('Switch to b from B.__getattribute__ in '
  28. + type(greenlet.getcurrent()).__name__)
  29. b.switch()
  30. results.append('B.__getattribute__ back from main in '
  31. + type(greenlet.getcurrent()).__name__)
  32. if name == 'run':
  33. name = '_B_run'
  34. return object.__getattribute__(self, name)
  35. def _B_run(self, *arg):
  36. results.append(('Begin B', arg))
  37. results.append('_B_run switching to main')
  38. main.switch('From B')
  39. class C(greenlet.greenlet):
  40. pass
  41. a = A(a_run)
  42. b = B(parent=a)
  43. c = C(c_run, b)
  44. # Start a child; while running, it will start B,
  45. # but starting B will ALSO start B.
  46. result = c.switch()
  47. results.append(('main from c', result))
  48. # Switch back to C, which was in the middle of switching
  49. # already. This will throw the ``GreenletStartedWhileInPython``
  50. # exception, which results in parent A getting started (B is finished)
  51. c.switch()
  52. results.append(('A dead?', a.dead, 'B dead?', b.dead, 'C dead?', c.dead))
  53. # A and B should both be dead now.
  54. assert a.dead
  55. assert b.dead
  56. assert not c.dead
  57. result = c.switch()
  58. results.append(('main from c.2', result))
  59. # Now C is dead
  60. assert c.dead
  61. print("RESULTS:", results)