Объектный пул — это порождающий паттерн проектирования, который управляет набором заранее инициализированных объектов, готовых к использованию. Когда системе нужен объект, она не создает его, а берет из пула, а после использования возвращает обратно.

Стоит использовать когда:

  • Когда создание объектов дорого стоит (по времени или ресурсам)
  • Когда объекты часто создаются и уничтожаются
  • Когда количество одновременно используемых объектов ограничено
  • Для управления подключениями к БД, потоками, сетевыми соединениями

Используется в соединениях с БД, в HTTP-клиентах, потоках и процессах и в игровых движках

Плюсы:

  • Сокращает накладные расходы на создание/уничтожение объектов.
  • Контролирует количество активных объектов.
  • Улучшает производительность при работе с "дорогими" объектами.

Минусы:

  • Требует корректного возврата объектов в пул.
  • Усложняет код.
  • Может привести к утечкам памяти, если объекты не возвращаются.

В отличие от других Фабричного метода, Одиночки и Прототипа, Объектный пул переиспользует множество объектов, управляет их жизненным циклом

Пример с контекстным менеджером `from contextlib import contextmanager

class ConnectionPool: def init(self, max_size): self.max_size = max_size self.pool = [] self._in_use = set()

def _create_connection(self): return {"id": id({}), "status": "active"}

@contextmanager def get_connection(self): if len(self.pool) > 0: conn = self.pool.pop() elif len(self.in_use) < self.max_size: conn = self._create_connection() else: raise Exception("Достигнут лимит соединений")

self.in_use.add(conn["id"]) try: yield conn finally: self.in_use.remove(conn["id"]) self._pool.append(conn)

#Использование

if name == "main": pool = ConnectionPool(2)

try: with pool.get_connection() as conn1: print(f"Используем соединение {conn1['id']}")

with pool.get_connection() as conn2: print(f"Используем соединение {conn2['id']}")

#Это вызовет исключение, так как пул переполнен

try: with pool.get_connection() as conn3: print(f"Используем соединение {conn3['id']}") except Exception as e: print(f"Ошибка: {e}") except Exception as e: print(f"Ошибка: {e}") #weekofpatterns`