framework.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import tornado.websocket
  2. import time, json
  3. from collections import defaultdict
  4. class Future:
  5. def __iter__(self):
  6. result = yield
  7. return result
  8. __await__ = __iter__ # make compatible with 'await' expression
  9. class Task:
  10. def __init__(self, coro):
  11. self.coro = coro
  12. f = Future()
  13. f.set_result(None)
  14. self.step(f)
  15. self.result = None # 协程的返回值
  16. self.on_task_finish = None # 协程完毕的回调函数
  17. def step(self, future):
  18. try:
  19. # send会进入到coro执行, 即fetch, 直到下次yield
  20. # next_future 为yield返回的对象
  21. next_future = self.coro.send(future.result)
  22. next_future.add_done_callback(self.step)
  23. except StopIteration as e:
  24. if len(e.args) == 1:
  25. self.result = e.args[0]
  26. if self.on_task_finish:
  27. self.on_task_finish(self.result)
  28. return
  29. class Msg:
  30. mid2callback = defaultdict(list)
  31. @staticmethod
  32. def gen_msg_id():
  33. mid = '%s-%s' % (Global.active_ws.sid, int(time.time()))
  34. return mid
  35. @classmethod
  36. def add_callback(cls, msg_id, callback):
  37. cls.mid2callback[msg_id].append(callback)
  38. @classmethod
  39. def get_callbacks(cls, msg_id):
  40. return cls.mid2callback[msg_id]
  41. @classmethod
  42. def get_callbacks(cls, msg_id):
  43. return cls.mid2callback[msg_id]
  44. @classmethod
  45. def unregister_msg(cls, msg_id):
  46. del cls.mid2callback[msg_id]
  47. class Global:
  48. active_ws: "EchoWebSocket"