Advertisement
mattfarley

Async Lifx

Feb 11th, 2017
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.54 KB | None | 0 0
  1. #
  2. # START ASYNC SETUP
  3. #
  4. import threading
  5.  
  6. class TimeoutError(RuntimeError):
  7. pass
  8.  
  9. class AsyncCall(object):
  10. def __init__(self, fnc, callback = None):
  11. self.Callable = fnc
  12. self.Callback = callback
  13.  
  14. def __call__(self, *args, **kwargs):
  15. self.Thread = threading.Thread(target = self.run, name = self.Callable.__name__, args = args, kwargs = kwargs)
  16. self.Thread.start()
  17. return self
  18.  
  19. def wait(self, timeout = None):
  20. self.Thread.join(timeout)
  21. if self.Thread.isAlive():
  22. raise TimeoutError()
  23. else:
  24. return self.Result
  25.  
  26. def run(self, *args, **kwargs):
  27. self.Result = self.Callable(*args, **kwargs)
  28. if self.Callback:
  29. self.Callback(self.Result)
  30.  
  31. class AsyncMethod(object):
  32. def __init__(self, fnc, callback=None):
  33. self.Callable = fnc
  34. self.Callback = callback
  35.  
  36. def __call__(self, *args, **kwargs):
  37. return AsyncCall(self.Callable, self.Callback)(*args, **kwargs)
  38.  
  39. def Async(fnc = None, callback = None):
  40. if fnc == None:
  41. def AddAsyncCallback(fnc):
  42. return AsyncMethod(fnc, callback)
  43. return AddAsyncCallback
  44. else:
  45. return AsyncMethod(fnc, callback)
  46.  
  47. #
  48. # END ASYNC SETUP
  49. #
  50. @Async
  51. def doWorkAsync(light):
  52. try:
  53. power = light.get_power()
  54. light.set_power("on" if power == 0 else "off")
  55. except:
  56. print(sys.exc_info()[0]) # TODO replace with logging
  57.  
  58. for light in self.lights:
  59. doWorkAsync(light)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement