Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

85 строки
1.8KB

  1. """
  2. Support for using stackless python. Broken and riddled with print statements
  3. at the moment. Please fix it!
  4. """
  5. import sys
  6. import types
  7. import stackless
  8. caller = None
  9. coro_args = {}
  10. tasklet_to_greenlet = {}
  11. def getcurrent():
  12. return tasklet_to_greenlet[stackless.getcurrent()]
  13. class FirstSwitch(object):
  14. def __init__(self, gr):
  15. self.gr = gr
  16. def __call__(self, *args, **kw):
  17. # print("first call", args, kw)
  18. gr = self.gr
  19. del gr.switch
  20. run, gr.run = gr.run, None
  21. t = stackless.tasklet(run)
  22. gr.t = t
  23. tasklet_to_greenlet[t] = gr
  24. t.setup(*args, **kw)
  25. t.run()
  26. class greenlet(object):
  27. def __init__(self, run=None, parent=None):
  28. self.dead = False
  29. if parent is None:
  30. parent = getcurrent()
  31. self.parent = parent
  32. if run is not None:
  33. self.run = run
  34. self.switch = FirstSwitch(self)
  35. def switch(self, *args):
  36. # print("switch", args)
  37. global caller
  38. caller = stackless.getcurrent()
  39. coro_args[self] = args
  40. self.t.insert()
  41. stackless.schedule()
  42. if caller is not self.t:
  43. caller.remove()
  44. rval = coro_args[self]
  45. return rval
  46. def run(self):
  47. pass
  48. def __bool__(self):
  49. return self.run is None and not self.dead
  50. class GreenletExit(Exception):
  51. pass
  52. def emulate():
  53. module = types.ModuleType('greenlet')
  54. sys.modules['greenlet'] = module
  55. module.greenlet = greenlet
  56. module.getcurrent = getcurrent
  57. module.GreenletExit = GreenletExit
  58. caller = stackless.getcurrent()
  59. tasklet_to_greenlet[caller] = None
  60. main_coro = greenlet()
  61. tasklet_to_greenlet[caller] = main_coro
  62. main_coro.t = caller
  63. del main_coro.switch # It's already running
  64. coro_args[main_coro] = None