Parallel
은 실제로는 최선의 옵션이 아닙니다. Parallel
은 코드를 병렬로 실행하지만 AWS에 대한 각 요청에 대해 여전히 스레드 풀 스레드를 사용합니다. 대신 BeginCopyObject
메서드를 사용하는 것이 리소스를 훨씬 효율적으로 사용할 수 있습니다. 이것은 응답 대기중인 스레드 풀 스레드를 사용하지 않지만 응답을 받았을 때 처리 할 필요가있을 때만 스레드 풀 스레드를 사용합니다.
다음은 시작/종료 방법을 사용하는 방법에 대한 간단한 예입니다. 이것들은 AWS에만 국한되는 것이 아니라 .NET BCL 전체에서 발견되는 패턴입니다.
public static CopyFoos()
{
var client = new AmazonS3Client(...);
var foos = GetFoos().ToList();
var asyncs = new List<IAsyncResult>();
foreach(var foo in foos)
{
var request = new CopyObjectRequest { ... };
asyncs.Add(client.BeginCopyObject(request, EndCopy, client));
}
foreach(IAsyncResult ar in asyncs)
{
if (!ar.IsCompleted)
{
ar.AsyncWaitHandle.WaitOne();
}
}
}
private static EndCopy(IAsyncRequest ar)
{
((AmazonS3Client)ar.AsyncState).EndCopyObject(ar);
}
생산 코드의 경우 발송 한 요청 수를 추적하고 한 번에 제한된 숫자 만 발송할 수 있습니다. 테스트 또는 AWS 문서는 최적의 동시 요청 수를 알려줍니다.
이 경우 우리는 실제로 요청이 완료 될 때 아무 것도 할 필요가 없으므로 EndCopy
호출을 건너 뛰고 싶지만 리소스가 누출 될 수 있습니다. BeginXxx를 호출 할 때마다 해당 EndXxx 메서드를 호출해야합니다.
'BeginCopyObject'에 대한 더 많은 정보를 제공해 주실 수 있습니까? –
@ Pure.Krome, 중요한 정보가 담긴 샘플을 추가했습니다. –