2019년 8월 17일 토요일

Python Asyncio 와 Threading, 그리고 multiprocessing


동시에 여러가지 일들을 처리하는 방법에는 여러가지가 있다.

파이썬에서는 3가지 정도 방법을 제시하고 있다.

첫번째는 thread, thread는 process를 새로 만드는것이 아니라 하나의 process안에서
time sharing을 하면서, 동시에 여러작업을 처리하는 것이다.

하지만, python에서는 GIL이라는 방식때문에, 이 thread가 완벽하게 제대로 일을 처리를 하지 못하는 문제가 있다.

그래서 두번째 multiprocessing을 한동안 쓰라고들 이야기가 돌았는데,
processing은 새로운 process를 만드는 것이다. 이것은 하나의 process에서 처리하는 것이 아니라, 아예 OS로부터 새로운 process를 할당받아서, 처리를 하는 것인데,
process를 새로 만들다보니, 앞뒤로 오버헤드가 붙는다.

이 경우는 GIL의 영향성을 받지는 않는데, 아무래도 새로 context를 생성하고 하는 작업때문에 다량의 프로세스를 만들때는 느려질 수 밖에 없다.

그래서 마지막으로 async, 이건 thread랑 비슷하긴한데, 조금 더 특이하다,
GIL이라는 것의 제약을 덜받기 위해서 IO bound job에서만 제어권을 넘기는 방법이다. 

실제 프로그램을 뜯어봤을때 시간을 잡아먹는 부분이
두종류가 있는데 하나는 CPU, 많은 연산량을 필요로 하는 부분이 있고
다른 하나는 I/O bound, I/O를 하면서 시간을 많이 잡아먹는 부분이 있다보니
이중에서 I/O access하는 동안에 cpu로 처리할 것을 처리할 수 있게 한것이 async io방식이다.

그럼 이중에 어떤것을 써야 가장 좋은가?? 라는 의문이 생기는데.

cpu bound에서는 multiprocessing이 좋고,
i/o bound에서는 , thread와 asyncio가 좋다는 결론이 나온다.

그럼 thread와 asyncio는 ??
asyncio가 대량의 처리를 하는데 유리하다고 한다,

결론은, asyncio가 요즘 유행하는 기법이긴하나,
상황에 맞게 쓰는 것이 낫다...