Питоновское
09.05
Объектный пул — это порождающий паттерн проектирования, который управляет набором заранее инициализированных объектов, готовых к использованию. Когда системе нужен объект, она не создает его, а берет из пула, а после использования возвращает обратно.
Стоит использовать когда: - Когда создание объектов дорого стоит (по времени или ресурсам) - Когда объекты часто создаются и уничтожаются - Когда количество одновременно используемых объектов ограничено - Для управления подключениями к БД, потоками, сетевыми соединениями
Используется в соединениях с БД, в 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`еще контент в этом сообществе
еще контент в этом соообществе
Питоновское
09.05
войдите, чтобы увидеть
и подписаться на интересных профи