def wait(self, timeout=None): """wait to be woken up by the condition .. note:: this method will block the current coroutine until a :meth:`notify` wakes it back up. :raises: `RuntimeError` if the underlying lock hasn't been :meth:`acquired <Lock.acquire>` """ if not self._is_owned(): raise RuntimeError("cannot wait on un-acquired lock") current = compat.getcurrent() waketime = None if timeout is None else time.time() + timeout if timeout is not None: scheduler.schedule_at(waketime, current) self._waiters.append((current, waketime)) self._lock.release() scheduler.state.mainloop.switch() self._lock.acquire() if timeout is not None: timedout = not scheduler._remove_timer(waketime, current) if timedout: self._waiters.remove((current, waketime)) return timedout return False
def wait(self, timeout=None): """pause the current coroutine until this event is set .. note:: this method will block the current coroutine if :meth:`set` has not been called. :param timeout: the maximum amount of time to block in seconds. the default of ``None`` allows indefinite blocking. :type timeout: number or None :returns: ``True`` if a timeout was provided and was hit, otherwise ``False`` """ if self._is_set: return False current = compat.getcurrent() # the waiting greenlet waketime = None if timeout is None else time.time() + timeout if timeout is not None: scheduler.schedule_at(waketime, current) self._waiters.append(current) scheduler.state.mainloop.switch() if timeout is not None: if not scheduler._remove_timer(waketime, current): self._waiters.remove(current) return True return False
def __init__(self, secs, func, args=(), kwargs=None): assert hasattr(func, "__call__"), "function argument must be callable" self.func = func self.args = args self.kwargs = kwargs self._glet = glet = greenlet(self.func, state.mainloop) self.waketime = waketime = time.time() + secs self.cancelled = False scheduler.schedule_at(waketime, glet)
def put(self, item, block=True, timeout=None): """put an item into the queue .. note:: if the queue was created with a `maxsize` and it is currently :meth:`full`, this method will block the calling coroutine until another coroutine :meth:`get`\ s an item. :param item: the object to put into the queue, can be any type :param block: whether to block if the queue is already :meth:`full` (default ``True``) :type block: bool :param timeout: the maximum time in seconds to block waiting. with the default of ``None``, it can wait indefinitely. this is unused if `block` is ``False``. :type timeout: int, float or None :raises: :class:`Full` if the queue is :meth:`full` and `block` is ``False``, or if `timeout` expires. """ if self.full(): if not block: raise Full() current = compat.getcurrent() waketime = None if timeout is None else time.time() + timeout if timeout is not None: scheduler.schedule_at(waketime, current) self._waiters.append((current, waketime)) scheduler.state.mainloop.switch() if timeout is not None: if not scheduler._remove_timer(waketime, current): self._waiters.remove((current, waketime)) raise Full() if self._waiters and not self.full(): scheduler.schedule(self._waiters.popleft()[0]) if not self._open_tasks: self._jobs_done.clear() self._open_tasks += 1 self._put(item)
def put(self, item, blocking=True, timeout=None): """put an item into the queue .. note:: if the queue was created with a `maxsize` and it is currently :meth:`full`, this method will block the calling coroutine until another coroutine :meth:`get`\ s an item. :param item: the object to put into the queue, can be any type :param blocking: whether to block if the queue is already :meth:`full` (default ``True``) :type blocking: bool :param timeout: the maximum time in seconds to block waiting. with the default of ``None``, it can wait indefinitely. this is unused if `blocking` is ``False``. :type timeout: int, float or None :raises: :class:`Full` if the queue is :meth:`full` and `blocking` is ``False``, or if `timeout` expires. """ if self.full(): if not blocking: raise Full() current = compat.getcurrent() waketime = None if timeout is None else time.time() + timeout if timeout is not None: scheduler.schedule_at(waketime, current) self._waiters.append((current, waketime)) scheduler.state.mainloop.switch() if timeout is not None: if not scheduler._remove_timer(waketime, current): self._waiters.remove((current, waketime)) raise Full() if self._waiters and not self.full(): scheduler.schedule(self._waiters.popleft()[0]) if not self._open_tasks: self._jobs_done.clear() self._open_tasks += 1 self._put(item)
def get(self, block=True, timeout=None): """get an item out of the queue .. note:: if `block` is ``True`` (the default) and the queue is :meth`empty`, this method will block the current coroutine until something has been :meth:`put`. :param block: whether to block if there is no data yet available (default ``True``) :type block: bool :param timeout: the maximum time in seconds to block waiting for data. with the default of ``None``, can wait indefinitely. this is unused if `block` is ``False``. :type timeout: int, float or None :raises: :class:`Empty` if there is no data in the queue and block is ``False``, or `timeout` expires :returns: something that was previously :meth:`put` in the queue """ if not self._data: if not block: raise Empty() current = compat.getcurrent() waketime = None if timeout is None else time.time() + timeout if timeout is not None: scheduler.schedule_at(waketime, current) self._waiters.append((current, waketime)) scheduler.state.mainloop.switch() if timeout is not None: if not scheduler._remove_timer(waketime, current): self._waiters.remove((current, waketime)) raise Empty() if self.full() and self._waiters: scheduler.schedule(self._waiters.popleft()[0]) return self._get()
def get(self, blocking=True, timeout=None): """get an item out of the queue .. note:: if `blocking` is ``True`` (the default) and the queue is :meth`empty`, this method will block the current coroutine until something has been :meth:`put`. :param blocking: whether to block if there is no data yet available (default ``True``) :type blocking: bool :param timeout: the maximum time in seconds to block waiting for data. with the default of ``None``, can wait indefinitely. this is unused if `blocking` is ``False``. :type timeout: int, float or None :raises: :class:`Empty` if there is no data in the queue and blocking is ``False``, or `timeout` expires :returns: something that was previously :meth:`put` in the queue """ if not self._data: if not blocking: raise Empty() current = compat.getcurrent() waketime = None if timeout is None else time.time() + timeout if timeout is not None: scheduler.schedule_at(waketime, current) self._waiters.append((current, waketime)) scheduler.state.mainloop.switch() if timeout is not None: if not scheduler._remove_timer(waketime, current): self._waiters.remove((current, waketime)) raise Empty() if self.full() and self._waiters: scheduler.schedule(self._waiters.popleft()[0]) return self._get()
def wait(self, timeout=None): """pause the current coroutine until this event is set .. note:: this method will block the current coroutine if :meth:`set` has not been called. :param timeout: the maximum amount of time to block in seconds. the default of ``None`` allows indefinite blocking. :type timeout: number or None :returns: ``True`` if a timeout was provided and was hit, otherwise ``False`` """ if self._is_set: return False current = compat.getcurrent() # the waiting greenlet waketime = None if timeout is None else time.time() + timeout if timeout is not None: scheduler.schedule_at(waketime, current) self._waiters.append(current) scheduler.state.mainloop.switch() if timeout is not None: if not scheduler._remove_timer(waketime, current): scheduler.state.awoken_from_events.discard(current) if current in self._waiters: self._waiters.remove(current) return True return False