본문 바로가기
개발/기타

[개발 상식]태스크(Task)와 코루틴(Coroutine)

by MNMNMNMN 2023. 11. 6.
728x90

태스크(Task)와 코루틴(Coroutine)

태스크 (Task)

특징

  • 병렬 실행: 태스크는 주로 병렬 실행을 관리하기 위한 개념으로 사용됩니다. 여러 개의 테스크가 동시에 실행되며, 각 테스크는 독립적인 작업을 수행합니다.
  • 스레드와 프로세스 내에서 사용: 태스크는 멀티스레딩 환경이나 멀티프로세스 환경에서 사용됩니다. 다른 스레드 또는 프로세스와 동시에 실행될 수 있습니다.
  • 동시성 제어: 태스크는 일반적으로 스레드 또는 프로세스 간에 데이터 공유와 동시성 문제를 다루기 위한 메커니즘을 제공합니다.

예시)

using System;
using System.Threading.Tasks;

class Program
{
    static async Task FooAsync()
    {
        Console.WriteLine("Start Foo");
        await Task.Delay(2000); // 비동기 대기
        Console.WriteLine("End Foo");
    }

    static async Task BarAsync()
    {
        Console.WriteLine("Start Bar");
        await Task.Delay(1000); // 비동기 대기
        Console.WriteLine("End Bar");
    }

    static async Task Main()
    {
        var task1 = FooAsync();
        var task2 = BarAsync();
        await Task.WhenAll(task1, task2);
    }

    static void Main(string[] args)
    {
        Main().Wait();
    }
}

코루틴 (Coroutine)

특징

  • 동시 실행: 코루틴은 여러 함수 또는 코드 블록이 동시에 실행될 수 있는 개념으로 사용됩니다. 하나의 스레드 내에서 실행되며, 스레드 간의 병렬 처리가 아닙니다.
  • 동일 스레드 내에서 사용: 코루틴은 동일한 스레드 내에서 실행되며, 다른 스레드와 병렬로 실행되지 않습니다.
  • 동작 일시 중지와 재개: 코루틴은 동작을 일시 중지하고 나중에 재개할 수 있는 능력을 제공하며, 비동기 작업을 처리하거나 이벤트 루프와 함께 사용됩니다.

예시)

using System;
using System.Collections.Generic;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        foreach (var value in Coroutine())
        {
            Console.WriteLine("Start Coroutine");
            await Task.Delay(2000); // 비동기 대기
            Console.WriteLine("End Coroutine");
        }
    }

    static async IAsyncEnumerable<int> Coroutine()
    {
        yield return 0;
    }
}

감사합니다.

728x90
반응형

댓글