gevent.py 1.0 KB

1234567891011121314151617181920212223242526272829303132333435
  1. from __future__ import absolute_import
  2. from apscheduler.schedulers.blocking import BlockingScheduler
  3. from apscheduler.schedulers.base import BaseScheduler
  4. try:
  5. from gevent.event import Event
  6. from gevent.lock import RLock
  7. import gevent
  8. except ImportError: # pragma: nocover
  9. raise ImportError('GeventScheduler requires gevent installed')
  10. class GeventScheduler(BlockingScheduler):
  11. """A scheduler that runs as a Gevent greenlet."""
  12. _greenlet = None
  13. def start(self, *args, **kwargs):
  14. self._event = Event()
  15. BaseScheduler.start(self, *args, **kwargs)
  16. self._greenlet = gevent.spawn(self._main_loop)
  17. return self._greenlet
  18. def shutdown(self, *args, **kwargs):
  19. super(GeventScheduler, self).shutdown(*args, **kwargs)
  20. self._greenlet.join()
  21. del self._greenlet
  22. def _create_lock(self):
  23. return RLock()
  24. def _create_default_executor(self):
  25. from apscheduler.executors.gevent import GeventExecutor
  26. return GeventExecutor()