You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

52 lines
1.0 KiB

import abc
import six
import gevent
import random
@six.add_metaclass(abc.ABCMeta)
class BaseQueue(object):
@abc.abstractmethod
def get(self):
raise NotImplementedError
class PlayableQueue(BaseQueue):
def __init__(self):
self._data = []
self._event = gevent.event.Event()
def append(self, item):
self._data.append(item)
if self._event:
self._event.set()
self._event = None
def _get(self):
if not len(self._data):
if not self._event:
self._event = gevent.event.Event()
self._event.wait()
return self._get()
return self._data.pop(0)
def get(self):
return self._get()
def shuffle(self):
random.shuffle(self._data)
def clear(self):
self._data = []
def __len__(self):
return len(self._data)
def __iter__(self):
return self._data.__iter__()
def __nonzero__(self):
return True
__bool__ = __nonzero__