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]