2017년 12월 1일 금요일

Unity3d, C# Parallel.Invoke

TPL(Task Parallel Library)은 작업이란 개념을 기반으로 하며 비동기 작업을 수행합니다.
작업 병렬 처리는 동시에 실행되는 하나 이상의 독립적인 작업을 의미합니다.
작업을 사용할 때의 주된 이점 두 가지는 다음과 같습니다.

- 시스템 리소스를 더 효율적이고 확장 가능한 방식으로 사용할 수 있습니다.
내부적으로 작업은 ThreadPool의 큐에 대기됩니다.
ThreadPool은 스레드 수를 파악하여 이에 맞게 조정하고, 처리량을 최대화하는 부하 분산을 제공하는 알고리즘을
사용하여 기능이 향상되었습니다.

- 프로그래밍 방식 제어 수준이 스레드 또는 작업 항목을 사용할 때보다 높아집니다.
Task를 기반으로 만들어진 프레임워크는 대기, 취소, 연속, 강력한 예외 처리, 세부 상태, 사용자 지정 예약 등을
지원하는 강력한 API 집합을 제공합니다.


// Invoke을 사용하여 작업을 병렬 처리하는 방법
Parallel.Invoke(() =>
    {
        Debug.Log($"Begin first task1... thread id : {Thread.CurrentThread.ManagedThreadId}");
        Task.Delay(1);
        Debug.Log("End first task1...");
    },

    () =>
    {
        Debug.Log($"Begin first task2... thread id : {Thread.CurrentThread.ManagedThreadId}");
        Task.Delay(1);
        Debug.Log("End first task2...");
    },

    () =>
    {
        Debug.Log($"Begin first task3... thread id : {Thread.CurrentThread.ManagedThreadId}");
        Task.Delay(1);
        Debug.Log("End first task3...");
    });

// Parallel.For 메서드를 사용하여 병렬 루프를 처리하는 방법
Parallel.For(
    0, // start index
    10, // end index
    (i, loopState) => // Action<Int32 or Int64>
    {
        Debug.Log($"Parallel.For... i : {i}, thread id : {Thread.CurrentThread.ManagedThreadId}");
    }
);

// Parallel.ForEach 메서드를 사용하여 병렬 루프를 처리하는 방법
string[] str = { "str1", "str2", "str3" };
Parallel.ForEach(str, 
    s =>
    {
        Debug.Log($"Parallel.ForEach... s : {s}, thread id : {Thread.CurrentThread.ManagedThreadId}");
    });

댓글 없음:

댓글 쓰기