.NET Core 에서 대상 풀 을 어떻게 실현 하거나 사용 합 니까?

7654 단어 .netcore대상 지
머리말
연못 이라는 개념 은 모두 가 잘 알 고 있다.예 를 들 어 우 리 는 데이터베이스 연결 탱크 와 스 레 드 탱크 를 자주 듣는다.그것 은 자원 집합 을 미리 분배 하 는 성능 최적화 사상 을 바탕 으로 한다.
쉽게 말 하면 대상 탱크 는 대상 의 용기 로 자원 의 사용 을 최적화 시 키 고 한 용기 에서 연못 화 대상 을 통 해 필요 에 따라 이러한 연못 화 대상 을 중복 사용 하여 성능 상의 수 요 를 만족 시 키 는 데 목적 을 둔다.대상 이 활성화 되면 연못 에서 꺼 냅 니 다.대상 이 정지 되 었 을 때,그것 은 다시 연못 에 놓 여 다음 요청 을 기 다 렸 다.대상 풀 은 일반적으로 대상 의 초기 화 과정 에서 대가 가 크 거나 사용 빈도 가 높 은 장면 에 사용 된다.
그럼.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는 Get 과 Return 작업 인 터 페 이 스 를 제공 합 니 다.대상 풀 을 만 들 때 풀 화 정책 IPooled Object Policy를 구조 적 매개 변수 로 제공 해 야 합 니 다.

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 사용 대상 풀 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기