.NET Core 에서 대상 풀 을 어떻게 실현 하거나 사용 합 니까?
연못 이라는 개념 은 모두 가 잘 알 고 있다.예 를 들 어 우 리 는 데이터베이스 연결 탱크 와 스 레 드 탱크 를 자주 듣는다.그것 은 자원 집합 을 미리 분배 하 는 성능 최적화 사상 을 바탕 으로 한다.
쉽게 말 하면 대상 탱크 는 대상 의 용기 로 자원 의 사용 을 최적화 시 키 고 한 용기 에서 연못 화 대상 을 통 해 필요 에 따라 이러한 연못 화 대상 을 중복 사용 하여 성능 상의 수 요 를 만족 시 키 는 데 목적 을 둔다.대상 이 활성화 되면 연못 에서 꺼 냅 니 다.대상 이 정지 되 었 을 때,그것 은 다시 연못 에 놓 여 다음 요청 을 기 다 렸 다.대상 풀 은 일반적으로 대상 의 초기 화 과정 에서 대가 가 크 거나 사용 빈도 가 높 은 장면 에 사용 된다.
그럼.NET 에서 대상 풀 을 어떻게 실현 하거나 사용 합 니까?
ASP.NET Core 프레임 워 크 에 대상 풀 기능 의 실현:Microsoft.Extensions.ObjectPool 이 내장 되 어 있 습 니 다.콘 솔 프로그램 이 라면 이 확장 라 이브 러 리 를 따로 설치 할 수 있 습 니 다.
연못 화 전략
우선,ObjectPool 을 사용 하려 면 풀 화 정책 을 만 들 고 대상 풀 에 대상 을 어떻게 만 들 고 대상 을 어떻게 돌려 주 는 지 알려 야 합 니 다.
이 정책 은 인터페이스 IPooled Object Policy 를 실현 함으로써 정의 합 니 다.다음은 가장 간단 한 정책 입 니 다.
public class FooPooledObjectPolicy : IPooledObjectPolicy<Foo>
{
public Foo Create()
{
return new Foo();
}
public bool Return(Foo obj)
{
return true;
}
}
매번 인 코딩 할 때마다 이러한 전략 을 정의 해 야 한다 면 비교적 번 거 로 울 것 이 며,스스로 통용 되 는 범 형 실현 을 정의 할 수 있다.Microsoft.Extensions.ObjectPool 에서 도 기본 적 인 범 형 실현 을 제공 합 니 다:Default Pooled Object Policy대상 풀 사용
대상 지 사용 의 원칙 은 빌려 주 는 것 도 있 고 돌려 주 는 것 도 어렵 지 않다 는 것 이다.
대상 풀 에 인 스 턴 스 가 없 을 때 인 스 턴 스 를 만 들 고 호출 구성 요소 에 되 돌려 줍 니 다.대상 풀 에 인 스 턴 스 가 있 을 때 기 존 인 스 턴 스 를 호출 구성 요소 에 직접 가 져 옵 니 다.그리고 이 과정 은 라인 이 안전 합 니 다.
Microsoft.Extensions.ObjectPool 은 기본 대상 풀 을 제공 합 니 다.Default ObjectPool
var policy = new DefaultPooledObjectPolicy<Foo>();
var pool = new DefaultObjectPool<Foo>(policy);
일반적인 예제(C\#9.0 단일 파일 전체 코드)를 보 겠 습 니 다.
using Microsoft.Extensions.ObjectPool;
using System;
var policy = new DefaultPooledObjectPolicy<Foo>();
var pool = new DefaultObjectPool<Foo>(policy);
//
var item1 = pool.Get();
//
pool.Return(item1);
Console.WriteLine("item 1: {0}", item1.Id);
//
var item2 = pool.Get();
//
pool.Return(item2);
Console.WriteLine("item 2: {0}", item2.Id);
Console.ReadKey();
public class Foo
{
public string Id { get; set; } = Guid.NewGuid().ToString("N");
}
인쇄 결과:인쇄 된 Id 를 통 해 아 이 템 1 과 아 이 템 2 가 같은 대상 임 을 알 수 있 습 니 다.
빌 리 기만 하고 또 어떻게 되 는 지 다시 한번 봅 시다.
// ...
//
var item1 = pool.Get();
Console.WriteLine("item 1: {0}", item1.Id);
//
var item2 = pool.Get();
Console.WriteLine("item 2: {0}", item2.Id);
// ...
인쇄 결과:두 대상 이 서로 다른 실례 임 을 알 수 있다.따라서 호출 구성 요소 가 대상 풀 에서 대상 인 스 턴 스 를 빌려 가면 사용 한 후에 대상 풀 에 즉시 반환 하여 중복 사용 하여 새로운 대상 을 구성 하 는 데 너무 많은 자원 을 소모 하지 않도록 해 야 합 니 다.
지정 대상 풀 용량
Default Object Pool
using Microsoft.Extensions.ObjectPool;
using System;
var policy = new DefaultPooledObjectPolicy<Foo>();
// 2。
var pool = new DefaultObjectPool<Foo>(policy, 2);
// 3
var item1 = pool.Get();
Console.WriteLine("item 1: {0}", item1.Id);
var item2 = pool.Get();
Console.WriteLine("item 2: {0}", item2.Id);
var item3 = pool.Get();
Console.WriteLine("item 3: {0}", item3.Id);
// 3
pool.Return(item1);
pool.Return(item2);
pool.Return(item3);
// 3
var item4 = pool.Get();
Console.WriteLine("item 4: {0}", item4.Id);
var item5 = pool.Get();
Console.WriteLine("item 5: {0}", item5.Id);
var item6 = pool.Get();
Console.WriteLine("item 6: {0}", item6.Id);
Console.ReadKey();
예시 코드 에서 나 는 대상 탱크 에 용량 을 2 로 지정 한 다음 에 3 개 를 빌려 서 3 개 를 돌려 주 고 그 다음 에 3 개 를 빌려 갔다.인쇄 결 과 를 보 겠 습 니 다:우 리 는 item 1 과 item 4 가 같은 대상 이 고 item 2 와 item 5 가 같은 대상 이라는 것 을 보 았 다.item 3 와 item 6 는 같은 대상 이 아니다.
대상 이 지 정 된 용량 을 초과 하 는 대상 수 를 풀 에서 꺼 내 같은 수의 대상 을 돌려 줬 지만 대상 풀 은 2 개 만 수용 할 수 있 고 세 번 째 대상 은 풀 리 지 않 는 다 는 것 이다.
ASP.NET Core 에서 사용
ASP.NET 코어 프레임 워 크 는 Microsoft.Extensions.ObjectPool 이 내장 되 어 있어 따로 설치 할 필요 가 없습니다.공식 문서 에는 ASP.NET Core 를 기반 으로 한 사용 예제 가 있 습 니 다.
https://docs.microsoft.com/en-us/aspnet/core/performance/objectpool
이 예 는 StringBuilder 를 지 화 시 켰 다.나 는 공식 적 인 예 를 직접 붙 였 다.좀 더 직관 적 으로 하기 위해 서 나 는 무관 한 코드 를 간소화 했다.
미들웨어 를 먼저 정의 합 니 다:
public class BirthdayMiddleware
{
private readonly RequestDelegate _next;
public BirthdayMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context, ObjectPool<StringBuilder> builderPool)
{
var stringBuilder = builderPool.Get();
try
{
stringBuilder.Append("Hi");
//
await context.Response.WriteAsync(stringBuilder.ToString());
}
finally //
{
builderPool.Return(stringBuilder);
}
}
}
Startup 에 해당 하 는 서비스 와 미들웨어 를 등록 합 니 다.
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.TryAddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();
services.TryAddSingleton<ObjectPool<StringBuilder>>(serviceProvider =>
{
var provider = serviceProvider.GetRequiredService<ObjectPoolProvider>();
var policy = new StringBuilderPooledObjectPolicy();
return provider.Create(policy);
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMiddleware<BirthdayMiddleware>();
}
}
이 예제 에 서 는 Default Object PoolProvider 를 사 용 했 습 니 다.기본 대상 인 풀 Provider 이기 때문에 대상 풀 Provider 를 사용자 정의 할 수 있 습 니 다.총결산
Microsoft.Extensions.ObjectPool 이 제공 하 는 대상 풀 의 기능 은 여전히 매우 유연 하 다.일반 장면 은 기본 적 인 풀 화 전략,기본 적 인 대상 풀 과 기본 적 인 대상 풀 공급 자 를 사용 하면 수 요 를 만족 시 킬 수 있 고 그 중의 임의의 위 젯 을 사용자 정의 하여 비교적 특수 하거나 복잡 한 수 요 를 실현 할 수 있다.
대상 지 의 사용 원칙 은 빌려 주 는 것 도 있 고 돌려 주 는 것 도 어렵 지 않다 는 것 이다.호출 구성 요소 가 대상 풀 에서 대상 인 스 턴 스 를 빌려 가면 사용 이 끝 난 후 즉시 대상 풀 에 반환 하여 중복 이용 하여 너무 많은 대상 으로 인해 시스템 성능 에 영향 을 주지 않도록 해 야 합 니 다.
.NET Core 에서 대상 풀 을 어떻게 실현 하거나 사용 하 는 지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련.NET Core 사용 대상 풀 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
AS를 통한 Module 개발1. ModuleLoader 사용 2. IModuleInfo 사용 ASModuleOne 모듈...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.