diff --git a/promise/__init__.py b/promise/__init__.py index ba52dbb..af77281 100644 --- a/promise/__init__.py +++ b/promise/__init__.py @@ -15,6 +15,25 @@ __version__ = get_version(VERSION) if not __SETUP__: - from .promise import Promise, promise_for_dict, promisify, is_thenable, async_instance + from .promise import ( + Promise, + promise_for_dict, + promisify, + is_thenable, + async_instance, + get_default_scheduler, + set_default_scheduler + ) + from .scheduler import SyncScheduler, ThreadScheduler - __all__ = ['Promise', 'promise_for_dict', 'promisify', 'is_thenable', 'async_instance'] + __all__ = [ + 'Promise', + 'promise_for_dict', + 'promisify', + 'is_thenable', + 'async_instance', + 'get_default_scheduler', + 'set_default_scheduler', + 'SyncScheduler', + 'ThreadScheduler' + ] diff --git a/promise/async_.py b/promise/async_.py index 87494e8..db71669 100644 --- a/promise/async_.py +++ b/promise/async_.py @@ -1,32 +1,5 @@ -# from threading import Timer, Thread - +# Based on https://github.com/petkaantonov/bluebird/blob/master/src/promise.js from .compat import Queue -# from .context import Context - -# Based on https://github.com/petkaantonov/bluebird/blob/master/src/async.js - - -class Scheduler(object): - - def call(self, fn): - # thread = Thread(target=fn) - # thread = Timer(0.01, fn) - # fn = thread.start - try: - # c = Context.peek_context() - # if not c: - fn() - # else: - # c.on_exit(fn) - except: - pass - # thread = Thread(target=fn) - # thread = Timer(0.001, fn) - # thread.start() - - -def get_default_scheduler(): - return Scheduler() # https://docs.python.org/2/library/queue.html#Queue.Queue @@ -36,13 +9,13 @@ def get_default_scheduler(): class Async(object): - def __init__(self, schedule=None): + def __init__(self, schedule): self.is_tick_used = False self.late_queue = Queue(LATE_QUEUE_CAPACITY) self.normal_queue = Queue(NORMAL_QUEUE_CAPACITY) self.have_drained_queues = False self.trampoline_enabled = True - self.schedule = schedule or get_default_scheduler() + self.schedule = schedule def enable_trampoline(self): self.trampoline_enabled = True diff --git a/promise/promise.py b/promise/promise.py index e0970c9..527a144 100644 --- a/promise/promise.py +++ b/promise/promise.py @@ -12,8 +12,18 @@ from .utils import deprecated, integer_types, string_types, text_type, binary_type from .context import Context from .promise_list import PromiseList +from .scheduler import SyncScheduler + +async_instance = Async(SyncScheduler()) + + +def get_default_scheduler(): + return async_instance.scheduler + + +def set_default_scheduler(scheduler): + async_instance.scheduler = scheduler -async_instance = Async() IS_PYTHON2 = version_info[0] == 2 DEFAULT_TIMEOUT = None # type: float diff --git a/promise/scheduler.py b/promise/scheduler.py new file mode 100644 index 0000000..015a909 --- /dev/null +++ b/promise/scheduler.py @@ -0,0 +1,15 @@ +from threading import Thread + + +class SyncScheduler(object): + def call(self, fn): + try: + fn() + except: + pass + + +class ThreadScheduler(object): + def call(self, fn): + thread = Thread(target=fn) + thread.start()