Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 30226|Ответ: 1

[.NET Core] Подробное объяснение Object Pool в .NET Core

[Скопировать ссылку]
Опубликовано 2020-4-15 17:38:34 | | | |
Microsoft.Extensions.ObjectPool является частью инфраструктуры ASP.NET Core, которая поддерживает хранение набора объектов в памяти для повторного использования, вместо того чтобы собирать объекты в мусорном режиме.
Если объекты, которыми вы хотите управлять, возможно, понадобится использовать пулы объектов:

  • Распределение/инициализация дорогостоящие.
  • Представляет собой ограниченный ресурс.
  • Используйте его предсказуемо и часто.


Повторное использование — важная тема и неизбежная проблема, с которой мы часто сталкиваемся в повседневном развитии.

Чтобы привести самый простой и знакомый пример: пулы соединений базы данных — это повторно используемые соединения баз данных.

Так в чём же смысл повторного использования?

Проще говоря, это снижает ненужные потери ресурсов.

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

Вы должны были реализовать похожие функции самостоятельно, либо с ConcurrentBag, либо ConcurrentQueue, либо с другими решениями.

Это также имеет реализацию, описанную в документации Microsoft

Как сделать: создать пул объектов с помощью ConcurrentBag

Вход по гиперссылке виден.

Конечно, в .NET Core Microsoft помогла нам реализовать простой Object Pool.

Сначала создайте новый консольный проект .NET Core и используйте команду nuget, чтобы добавить следующий пакет:

Весь код следующий:

Применение 1



Перед созданием пула нужно определить политику. Здесь мы напрямую используем прилагаемый DefaultPooledObjectPolicy для его построения.

В пуле объектов будет поддерживаться максимальное количество потоков.

Используйте метод Get объекта пула, чтобы вывести объект из пула объектов.

Приведённый выше код запускает результат

#1-464d2e03-604d-4451-b68a-8a3a2abdfccc-itsvse.com-1/1/0001 00:00
#2-70122aa0-a949-4c63-b878-321efe64c234-itsvse.com-1/1/0001 00:00
#3-de717815-796a-4349-a571-047acc125104-itsvse.com-1/1/0001 00:00 00:00
#4-3a404341-a560-47f7-a3b0-0d477a8ae17f-itsvse.com-1/1/0001 00:00
#5-51c96126-d424-4b58-b07c-6408e6c4cea6-itsvse.com-1/1/0001 00:00
#6-7ea4d596-fd2a-43b3-959a-9e48da58a758-itsvse.com-1/1/0001 00:00
#7-6874c64b-532d-4f92-a4fb-ff472da574a1-itsvse.com-1/1/0001 00:00
#8-ca767674-2c07-4f26-975f-4711a31d795d-itsvse.com-1/1/0001 00:00
#9-a9cd1859-a919-46a0-ae5d-85b6d3d11ccb-itsvse.com-1/1/0001 00:00
#10-fe89ed8b-4dfd-4eef-b876-b2a60ee50958-itsvse.com-1/1/0001 00:00
Этот результат показывает, что объекты в Object Pool являются напрямую новыми, и некоторые свойства не обесцениваются, что часто не имеет большого практического значения в данный момент.

Поскольку DefaultPooledObjectPolicy — это новый объект напрямую, часто это не то, чего мы ожидаем!

Если вы хотите соответствовать нашему реальному использованию, вам нужно самостоятельно определить полис!

Давайте рассмотрим второе применение

Применение 2

Метод Create используется для создания объекта Demo, а метод Return — чтобы вернуть объект Demo обратно в Object Pool (заимствован и возвращённый).



Пул объектов здесь определен так, чтобы содержать только один объект.

Поскольку после извлечения из пула объектов выполняется одношаговая операция возврата, item1 и item2 должны быть одним и тем же объектом.

После удаления item2 из пула объектов он не возвращается, поэтому пул объектов создаст новый объект на основе определённой нами политики.

Вот результат использования 2:

985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15.04.2020 03:31:15
985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15.04.2020 03:31:15
True
8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com-15.04.2020 3:31:15
False
Вы видите, что отдельные свойства items1, item2 и item3 совпадают, а item 1 и item 2 действительно являются одним и тем же объектом. Предмет 3 и предмет 1 — это не одно и то же.


Применение 3

Вы видите, что item1 и item2 — это один и тот же объект. При заборе объекта из пула объектов будет захвачен первый, так что если вы вернёте его и заберёте снова, вы всё равно получите оригинал первым.



item3 берётся напрямую из пула объектов и не создаётся снова, потому что пул объектов здесь поддерживает несколько объектов, а не только один в использовании 2, поэтому он берётся напрямую из пула.

Вот результат вывода

f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15.04.2020 03:33:58
f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15.04.2020 03:33:58
True
b933b593-af6d-4ebe-b21b-e8784d124764-itsvse.com-15.04.2020 03:33:58
False
То же самое, что и во втором случае, суть остаётся той же.

Применение 4

Похоже, что вышеописанное применение не так уж похоже на наше обычное применение. Нам всё ещё нужно полагаться на инъекции.

Итак, давайте наконец посмотрим, как комбинировать инъекции зависимости. Конечно, суть здесь по-прежнему неотделима от двух вещей — политики и поставщика.



Сначала нужно зарегистрировать провайдера, а затем напрямую взять его экземпляр для создания пула объектов.

Если хотите использовать его в другом месте, можно ввести через конструктор.

Результат здесь тоже такой же, как и раньше, особо нечего сказать.

сводка

Но независимо от типа использования, нужно понимать, что Object Pool неотделима от трёх участников — Pool, Policy и Provider.

С этими тремя, может быть, мы сможем делать всё, что захотим.

Конечно, там также есть несколько особенных вещей, которые вы можете ознакомиться, если вам интересно.

LeakTrackingObjectPool

StringBuilderPooledObjectPolicy





Предыдущий:Введение в улучшения веб-сервисов (WSE) 3.0
Следующий:Как Visual Studio 2013 находит контент, который заменяет несколько строк?
 Хозяин| Опубликовано 2023-8-30 18:34:07 |
DefaultObjectPool используется на базовом уровнеConcurrentQueueРеализация очереди безопасности потоков, исходный код выглядит следующим образом:


Вход по гиперссылке виден.


Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com