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