Source code for bigchaindb_driver.pool

from abc import ABCMeta, abstractmethod


[docs]class AbstractPicker(metaclass=ABCMeta): """Abstract class for picker classes that pick connections from a pool.""" @abstractmethod
[docs] def pick(self, connections): """Picks a :class:`~bigchaindb_driver.connection.Connection` instance from the given list of :class:`~bigchaindb_driver.connection.Connection` instances. Args: connections (List): List of :class:`~bigchaindb_driver.connection.Connection` instances. """ pass # pragma: no cover
[docs]class RoundRobinPicker(AbstractPicker): """Object to pick a :class:`~bigchaindb_driver.connection.Connection` instance from a list of connections. Attributes: picked (str): List index of :class:`~bigchaindb_driver.connection.Connection` instance that has been picked. """
[docs] def __init__(self): """Initializes a :class:`~bigchaindb_driver.pool.RoundRobinPicker` instance. Sets :attr:`picked` to `-1`. """ self.picked = -1
[docs] def pick(self, connections): """Picks a :class:`~bigchaindb_driver.connection.Connection` instance from the given list of :class:`~bigchaindb_driver.connection.Connection` instances. Args: connections (List): List of :class:`~bigchaindb_driver.connection.Connection` instances. """ self.picked += 1 self.picked = self.picked % len(connections) return connections[self.picked]
[docs]class Pool: """Pool of connections."""
[docs] def __init__(self, connections, picker_class=RoundRobinPicker): """Initializes a :class:`~bigchaindb_driver.pool.Pool` instance. Args: connections (list): List of :class:`~bigchaindb_driver.connection.Connection` instances. """ self.connections = connections self.picker = picker_class()
[docs] def get_connection(self): """Gets a :class:`~bigchaindb_driver.connection.Connection` instance from the pool. Returns: A :class:`~bigchaindb_driver.connection.Connection` instance. """ if len(self.connections) > 1: return self.picker.pick(self.connections) return self.connections[0]