Source code for koapy.backend.kiwoom_open_api_plus.utils.queue.QueueBasedBufferedIterator
import sys
import threading
from queue import Queue
from koapy.backend.kiwoom_open_api_plus.utils.queue.QueueIterator import (
BufferedQueueIterator,
)
from koapy.utils.logging.Logging import Logging
[docs]class QueueBasedBufferedIterator(BufferedQueueIterator, Logging):
_check_timeout = 1
_default_maxsize = 10
def __init__(self, iterator, queue=None, maxsize=None):
if queue is None:
if maxsize is None:
maxsize = self._default_maxsize
queue = Queue(maxsize)
self._iterator = iterator
self._queue = queue
self._maxsize = maxsize
self._exc_info = None
super().__init__(self._queue)
self._thread = threading.Thread(target=self._consume_iterator, daemon=True)
self._thread.start()
def _consume_iterator(self):
try:
for item in self._iterator:
self._queue.put(item)
except Exception: # pylint: disable=broad-except
self.logger.exception("Exception raised while consuming iterator")
self._exc_info = sys.exc_info()
[docs] def next(self, block=True, timeout=None):
try:
item = super().next(block, timeout)
except StopIteration as e:
if self._exc_info is not None:
raise self._exc_info[1] from e
else:
raise e
else:
if self._exc_info is not None:
raise self._exc_info[1]
return item