3 changed files with 62 additions and 3 deletions
@ -0,0 +1,31 @@ |
|||
import abc |
|||
import six |
|||
import gevent |
|||
|
|||
|
|||
@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) |
@ -0,0 +1,28 @@ |
|||
import gevent |
|||
from unittest import TestCase |
|||
|
|||
from disco.voice.queue import PlayableQueue |
|||
|
|||
|
|||
class TestPlayableQueue(TestCase): |
|||
def test_append(self): |
|||
q = PlayableQueue() |
|||
q.append(1) |
|||
q.append(2) |
|||
q.append(3) |
|||
|
|||
self.assertEqual(q._data, [1, 2, 3]) |
|||
self.assertEqual(q.get(), 1) |
|||
self.assertEqual(q.get(), 2) |
|||
self.assertEqual(q.get(), 3) |
|||
|
|||
def test_blocking_get(self): |
|||
q = PlayableQueue() |
|||
result = gevent.event.AsyncResult() |
|||
|
|||
def get(): |
|||
result.set(q.get()) |
|||
|
|||
gevent.spawn(get) |
|||
q.append(5) |
|||
self.assertEqual(result.get(), 5) |
Loading…
Reference in new issue