Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 30226|Resposta: 1

[.NET Core] Explicação detalhada do Object Pool no .NET Core

[Copiar link]
Postado em 15-04-2020 às 17:38:34 | | | |
O Microsoft.Extensions.ObjectPool faz parte da infraestrutura ASP.NET Core, que suporta manter um conjunto de objetos na memória para reutilização, em vez de permitir a coleta de lixo dos objetos.
Se os objetos que você deseja gerenciar forem, talvez seja necessário usar pools de objetos:

  • A alocação/inicialização é cara.
  • Representa algum recurso limitado.
  • Use de forma previsível e frequente.


A reutilização é um tema importante e um problema inevitável que frequentemente encontramos em nosso desenvolvimento diário.

Para pegar o exemplo mais simples e familiar, pools de conexões de banco de dados são conexões de banco de dados reutilizadas.

Então, qual é o sentido do reuso?

Simplificando, reduz a perda desnecessária de recursos.

Além das conexões com bancos de dados, pode haver muitos outros objetos que precisam ser reutilizados sob diferentes cenários ou requisitos, e existe um chamado Object Pool.

Você deveria ter implementado funções semelhantes você mesmo, seja com ConcurrentBag, ConcurrentQueue ou com outras soluções.

Isso também compartilha uma implementação na documentação da Microsoft

Como: Criar um Pool de Objetos usando um ConcurrentBag

O login do hiperlink está visível.

Claro, no .NET Core, a Microsoft nos ajudou a implementar um simples Object Pool.

Primeiro, crie um novo projeto de console .NET Core e use o comando nuget para adicionar o seguinte pacote:

Todo o código é o seguinte:

Uso 1



Antes de criar um pool, precisamos definir uma Política. Aqui, usamos diretamente o DefaultPooledObjectPolicy incluído para construí-lo.

O pool de objetos terá um número máximo de threads mantidos.

Use o método Get do objeto do pool para tirar um objeto do pool de objetos.

O código acima executa o resultado

#1-464d2e03-604d-4451-b68a-8a3a2abdfccc-itsvse.com-1/1/0001 00:00:00
#2-70122aa0-a949-4c63-b878-321efe64c234-itsvse.com-01/01/0001 00:00
#3-de717815-796a-4349-a571-047acc125104-itsvse.com-1/1/0001 00:00
#4-3a404341-a560-47f7-a3b0-0d477a8ae17f-itsvse.com-01/01/0001 00:00
#5-51c96126-d424-4b58-b07c-6408e6c4cea6-itsvse.com-01/01/0001 00:00
#6-7ea4d596-fd2a-43b3-959a-9e48da58a758-itsvse.com-01/00/0001 00:00
#7-6874c64b-532d-4f92-a4fb-ff472da574a1-itsvse.com-01/01/0001 00:00
#8-ca767674-2c07-4f26-975f-4711a31d795d-itsvse.com-01/01/0001 00:00
#9-a9cd1859-a919-46a0-ae5d-85b6d3d11ccb-itsvse.com-01/1/0001 00:00
#10-fe89ed8b-4dfd-4eef-b876-b2a60ee50958-itsvse.com-01/01/0001 00:00:00
Esse resultado mostra que os objetos no Object Pool são diretamente renovados, e algumas propriedades não são desvalorizadas, o que muitas vezes não tem muito significado prático atualmente.

Como DefaultPooledObjectPolicy é um objeto novo diretamente, muitas vezes isso não é o que esperamos!

Se você quiser atender ao nosso uso real, precisa definir uma política por conta própria!

Vamos dar uma olhada no uso 2

Uso 2

O método Create é usado para criar o objeto Demo, e o método Return é para lançar o objeto Demo de volta no Object Pool (emprestado e retornado).



O conjunto de objetos é definido aqui para conter apenas um objeto.

Como há uma operação de retorno em uma etapa após retirá-lo do conjunto de objetos, item1 e item2 devem ser o mesmo objeto.

Após retirar o item2 do pool de objetos, ele não é devolvido, então o pool de objetos criará um novo objeto com base na política que definimos.

Aqui está o resultado de saída do uso 2:

15/04/985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com de 2020 3:31:15
15/04/985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com de 2020 3:31:15
True
8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com-15/04/2020 3:31:15
False
Você pode ver que as propriedades individuais do item1, item2 e item3 são as mesmas, e item1 e item2 são de fato o mesmo objeto. Item3 e item 1 não são a mesma coisa.


Uso 3

Você pode ver que item1 e item2 são o mesmo objeto. Ao buscar um objeto do Object Pool, o primeiro será pego, então se você devolvê-lo e recuperá-lo novamente, ainda receberá o original primeiro.



o item3 é retirado diretamente do Object Pool ali e não é criado novamente, porque o Object Pool aqui mantém múltiplos objetos, não apenas um em uso 2, então ele é retirado diretamente do Pool.

Aqui está o resultado de saída

f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15/04/2020 3:33:58
f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15/04/2020 3:33:58
True
b933b593-af6d-4ebe-b21b-e8784d124764-itsvse.com-15/04/2020 3:33:58
False
Igual ao uso 2, a essência é a mesma.

Uso 4

Parece que o uso acima não é tão parecido com o nosso uso normal. Ainda precisamos depender da injeção.

Então, vamos finalmente ver como combinar a injeção de dependência. Claro, a essência aqui ainda é inseparável das duas coisas de Política e Provedor.



Primeiro precisamos registrar o Provedor e, em seguida, pegar diretamente sua instância para criar um Object Pool.

Se quiser usá-lo em outro lugar, pode injetar pelo construtor.

O resultado aqui também é o mesmo de antes, não há muito o que dizer.

resumo

Mas, independentemente do tipo de uso, precisamos entender que o Object Pool é inseparável dos três caras do Pool, da Política e do Provedor.

Com esses três, talvez possamos fazer o que quisermos.

Claro, ele também oferece várias coisas especiais que você pode conferir se tiver interesse.

PoolObjectTraceingLeaking

StringBuilderPooledObjectPolicy





Anterior:Introdução às Melhorias de Serviços Web (WSE) 3.0
Próximo:Como o Visual Studio 2013 encontra conteúdo que substitui várias linhas?
 Senhorio| Postado em 2023-8-30 18:34:07 |
O DefaultObjectPool é usado no nível subjacenteConcurrentQueueImplementação da fila de segurança de threads, o código-fonte é o seguinte:


O login do hiperlink está visível.


Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com