2021년 3월 11일 목요일

c# async await 그놈

 c# 에서 task 랑 async await 은 병렬처리를 가능하게 해준다.
헷갈릴수 있는 요소가 다분히 있다.

async 메서드가 await를 만나면 호출자로 제어를 반환하고 비동기로 실행된다.
라고하는데 이게 진짜 병렬로 되는건지 몰라서 테스트를 해봤다.

내컴퓨터가 4코어 4쓰레드인데 다음을 실행해보았다.

class Program
{
        async static void C1()
        {

            await Task.Delay(1);
            int a = 0;
            while (true)
            {
                a++;
                if (a == 1000)
                    Console.WriteLine("C1: 1000");
            }
        }

        async static void C2()
        {

            await Task.Delay(1);
            int a = 0;
            while (true)
            {
                a++;
                if (a == 1000)
                    Console.WriteLine("C2: 1000");
            }
        }

        async static void C3()
        {

            await Task.Delay(1);
            int a = 0;
            while (true)
            {
                a++;
                if (a == 1000)
                    Console.WriteLine("C3: 1000");
            }
        }

        //
        static void Main(string[] args)
        {
            C1();
            C2();
            C3();

            int a = 0;
            while (true)
            {
                a++;
                if (a == 1000)
                    Console.WriteLine("MAIN: 1000");
            }
        }
    }


코드는 c1 c2 c3 랑 메인이 있는데 c땡 메서드는 진입하자마자 await으로 제어를 반환
하고 정수하나를 계속 증가 시킨다. 별도 익셉션처리를 안했으니까
오버플로우나고 음수진입해서 다시 양수로 진입하면서 언젠간 1000이 계속 된다.
그리고 증가연산계속하니까 CPU가 엄청 바쁘겠지.. 그때 사용량을 보면 CPU의 나머지
코어를 사용하니까 사용률이 70퍼 이상올라간다.

결론: async는 메서드를 병렬처리되는 비동기로 만들어주는거 맞다.
그리고 await을 만나야지 분기되는거 같다.
그리고 메인쓰레드에 CPU 자원을 더 주는것같다.

댓글 없음:

댓글 쓰기