ThreadProxy.py 846 B

1234567891011121314151617181920212223242526
  1. from BTL.defer import Deferred, defer_to_thread
  2. class ThreadProxy(object):
  3. __slots__ = ('obj', 'local_queue_task', 'thread_queue_task')
  4. def __init__(self, obj, local_queue_task, thread_queue_task):
  5. self.obj = obj
  6. self.local_queue_task = local_queue_task
  7. self.thread_queue_task = thread_queue_task
  8. def __gen_call_wrapper__(self, f):
  9. def call_wrapper(*a, **kw):
  10. return defer_to_thread(self.local_queue_task, self.thread_queue_task,
  11. f, *a, **kw)
  12. return call_wrapper
  13. def __getattr__(self, attr):
  14. a = getattr(self.obj, attr)
  15. if callable(a):
  16. return self.__gen_call_wrapper__(a)
  17. return a
  18. def call_with_obj(self, _f, *a, **k):
  19. w = self.__gen_call_wrapper__(_f)
  20. return w(self.obj, *a, **k)