def schedule_periodic(self, period, action, state=None): """Schedules a periodic piece of work by dynamically discovering the schedulers capabilities. Keyword arguments: period -- Period for running the work periodically. action -- Action to be executed. state -- [Optional] Initial state passed to the action upon the first iteration. Returns the disposable object used to cancel the scheduled recurring action (best effort).""" scheduler = self seconds = self.to_relative(period)/1000.0 if not seconds: return scheduler.schedule(action, state) def interval(): new_state = action(scheduler, state) scheduler.schedule_periodic(period, action, new_state) log.debug("timeout: %s", seconds) timer = [eventlet.spawn_after(seconds, interval)] def dispose(): timer[0].kill() return Disposable.create(dispose)
def schedule_periodic(self, period, action, state=None): """Schedules an action to be executed periodically. Keyword arguments: period -- Period for running the work periodically. action -- {Function} Action to be executed. state -- [Optional] Initial state passed to the action upon the first iteration. Returns {Disposable} The disposable object used to cancel the scheduled action (best effort).""" scheduler = self seconds = self.to_relative(period)/1000.0 if seconds == 0: return scheduler.schedule(action, state) def interval(): new_state = action(state) scheduler.schedule_periodic(period, action, new_state) handle = [self.loop.call_later(seconds, interval)] def dispose(): # nonlocal handle handle[0].cancel() return Disposable.create(dispose)
def connect(self): if not self.has_subscription: self.has_subscription = True def dispose(): self.has_subscription = False disposable = self.source.subscribe(self.subject) self.subscription = CompositeDisposable(disposable, Disposable.create(dispose)) return self.subscription
def connect(self): """Connects the observable.""" if not self.has_subscription: self.has_subscription = True def dispose(): self.has_subscription = False disposable = self.source.subscribe(self.subject) self.subscription = CompositeDisposable(disposable, Disposable.create(dispose)) return self.subscription
def subscribe(observer): count[0] += 1 should_connect = count[0] == 1 subscription = source.subscribe(observer) if should_connect: connectable_subscription[0] = source.connect() def dispose(): subscription.dispose() count[0] -= 1 if not count[0]: connectable_subscription[0].dispose() return Disposable.create(dispose)
def subscribe(observer): n = len(sources) queues = [[] for _ in range(n)] is_done = [False] * n def next(i): if all([len(q) for q in queues]): res = [x.pop(0) for x in queues] observer.on_next(res) elif all([x for j, x in enumerate(is_done) if j != i]): observer.on_completed() return def done(i): is_done[i] = True if all(is_done): observer.on_completed() return subscriptions = [None] * n def func(i): subscriptions[i] = SingleAssignmentDisposable() def on_next(x): queues[i].append(x) next(i) subscriptions[i].disposable = sources[i].subscribe( on_next, observer.on_error, lambda: done(i)) for idx in range(n): func(idx) composite_disposable = CompositeDisposable(subscriptions) def action(): for _ in queues: queues[n] = [] composite_disposable.add(Disposable.create(action)) return composite_disposable
def subscribe(observer): n = len(sources) queues = [[] for _ in range(n)] is_done = [False] * n def next(i): if all([len(q) for q in queues]): res = [x.pop(0) for x in queues] observer.on_next(res) elif all([x for j, x in enumerate(is_done) if j != i]): observer.on_completed() return def done(i): is_done[i] = True if all(is_done): observer.on_completed() return subscriptions = [None]*n def func(i): subscriptions[i] = SingleAssignmentDisposable() def on_next(x): queues[i].append(x) next(i) subscriptions[i].disposable = sources[i].subscribe(on_next, observer.on_error, lambda: done(i)) for idx in range(n): func(idx) composite_disposable = CompositeDisposable(subscriptions) def action(): for _ in queues: queues[n] = [] composite_disposable.add(Disposable.create(action)) return composite_disposable