summaryrefslogtreecommitdiff
path: root/apscheduler/schedulers/gevent.py
blob: d48ed74af2e342be824133deaf01350f99b0a3e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from __future__ import absolute_import

from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.schedulers.base import BaseScheduler

try:
    from gevent.event import Event
    from gevent.lock import RLock
    import gevent
except ImportError:  # pragma: nocover
    raise ImportError('GeventScheduler requires gevent installed')


class GeventScheduler(BlockingScheduler):
    """A scheduler that runs as a Gevent greenlet."""

    _greenlet = None

    def start(self, *args, **kwargs):
        self._event = Event()
        BaseScheduler.start(self, *args, **kwargs)
        self._greenlet = gevent.spawn(self._main_loop)
        return self._greenlet

    def shutdown(self, *args, **kwargs):
        super(GeventScheduler, self).shutdown(*args, **kwargs)
        self._greenlet.join()
        del self._greenlet

    def _create_lock(self):
        return RLock()

    def _create_default_executor(self):
        from apscheduler.executors.gevent import GeventExecutor
        return GeventExecutor()