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

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

Используется в соединениях с БД, в 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`
repost

42

input message

напишите коммент

еще контент в этом сообществе

еще контент в этом соообществе

войдите, чтобы увидеть

и подписаться на интересных профи

в приложении больше возможностей

пока в веб-версии есть не всё — мы вовсю работаем над ней

сетка — cоциальная сеть для нетворкинга от hh.ru

пересекайтесь с теми, кто повлияет на ваш профессиональный путь