Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.59 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. from gevent import monkey
  4. monkey.patch_all() # Patch everything
  5. import gevent
  6. import time
  7.  
  8.  
  9. class Hub(object):
  10. """A simple reactor hub... In async!"""
  11.  
  12. def __init__(self, name=None):
  13. self.name = name
  14. self.handlers = {}
  15.  
  16. def on(self, event_name, handler):
  17. """Binds an event to a function."""
  18. handlers = self.handlers.get(event_name, [])
  19. if not handler in handlers:
  20. handlers.append(handler)
  21. self.handlers[event_name] = handlers
  22.  
  23. def off(self, event_name, handler):
  24. """Unbinds an event to a function."""
  25. handlers = self.handlers.get(event_name, [])
  26. handlers.remove(handler)
  27.  
  28. def emit(self, event_name, *args, **kwargs):
  29. """Calls an event. You can also pass arguments."""
  30. handlers = self.handlers.get(event_name, [])
  31. for handler in handlers:
  32. # XXX: If spawned within a greenlet, there's no need to join
  33. # the greenlet. It is automatically executed.
  34. gevent.spawn(handler, *args, **kwargs)
  35.  
  36. def start(self, *entry_points):
  37. """Run entry point."""
  38. gevent.joinall([gevent.spawn(ep) for ep in entry_points])
  39.  
  40.  
  41. ##
  42. #
  43. # Usage...
  44. #
  45. # Here's an example that uses redis' pub/sub feature.
  46. ##
  47.  
  48. import redis
  49.  
  50. # Create an instance of the hub.
  51. hub = Hub(name='myhub')
  52. # Create a redis instance
  53. r = redis.Redis(host='192.168.1.48', port=6379)
  54.  
  55.  
  56. def emojify(string):
  57. # Let's say that this is a long process.
  58. time.sleep(5)
  59. print ( "Emojifies: :%s:" % string )
  60.  
  61.  
  62. def hello(string):
  63. # A slightly long process.
  64. time.sleep(1)
  65. print ("Says hello: Hello, %s" % string )
  66.  
  67.  
  68. # You can bind multiple events.
  69. hub.on('name.awesome', emojify)
  70. hub.on('name.awesome', hello)
  71.  
  72.  
  73. # More events.
  74. def capitalize_then_proceed(string):
  75. print( "Capitalize: %s" % string.upper() )
  76. # You can also emit more events
  77. hub.emit('name.awesome', string)
  78.  
  79.  
  80. hub.on('name.only_me', capitalize_then_proceed)
  81.  
  82.  
  83. def entry_point():
  84. ps = r.pubsub()
  85. ps.subscribe(['awesome'])
  86. for message in ps.listen():
  87. print( "message = %s " % message )
  88. print( " type = %s , data = %s " % ( message['type'], message['data'] ) )
  89. if message['type'] == 'message':
  90. print ( "# Before events." )
  91. if message['data'].lower() != 'jesse':
  92. hub.emit('name.awesome', message['data'])
  93. else:
  94. hub.emit('name.only_me', message['data'])
  95. print ( "# Should be after events but it happens in async!" )
  96.  
  97.  
  98. if __name__ == '__main__':
  99. print ( "Running awesome!" )
  100. hub.start(entry_point)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement