티스토리 뷰


파이썬을 접한지 얼마 안되고 본 프로젝트를 시작한 뒤 얼마안되 작은 문제에 봉착하였습니다.


스레드의 사용이 필요해진 것입니다.



바로 다음과 같은 이유 때문입니다.


pygame은 메인스레드에선 작동하게끔 되어 있습니다. 


물론 메인스레드에서 pygame을 수행하면서 소켓작업(send,recv)까지 해도 되긴 하겠지만


그래픽작업에 있어 중간에 소켓작업까지 겹친다면 


원하는 속도를 보장할 수 없을거라 생각하였습니다.


때문에 threading을 상속받아 소켓을 select형태의 non-blocking형식으로 설계하여


프로젝트를 진행하려 했습니다.


(non-blocking으로 한다면 recv에서 자원을 선점하지 않을테니 메인스레드 하나로도


게임 실행에 문제는 없을것입니다)



하지만 어느정도 구현이 진척되고 테스트를 해보니 속도가 전혀 나아지지 않았습니다.


해서 디버깅으로 어느 부분에서 자원을 많이 잡아 먹나 검사하려는데 sub-thread를 한줄한줄 넘길때마다


속도가 너무 느린것입니다. 디버깅 모드이기 때문이라 할 수도 있겠지만 그래도 이해하기 힘들었습니다.


그래서 얼마전에 구입한 effective python의 병렬성 파트를 읽어보니


그 이유가 적혀있습니다.




바이트코드 인터프리터는 파이썬 프로그램이 실행되는 동안 지속되고, 일관성 있는 상태를 유지한다.


파이썬은 전역 인터프리터 잠금(GIL)이라는 매커니즘으로 일관성을 유지한다.


(중략)...


GIL을 중요한 부작용을 갖고 있다. 타 언어로 작성한 프로그램에서 여러 스레드를 실행한다는 건 프로그램이 


동시에 여러 CPU코어를 사용함을 의미한다. 파이썬도 멀티스레드를 지원하지만, GIL은 한 번에 한 스레드만을 실행하게 한다





다시 말해 파이썬은 스크립트 언어이기때문에 인터프리터로 한줄한줄 번역되어 수행하게 됩니다.


C나 자바처럼 obj, 링크 과정을 거쳐 exe파일을 만들어내는 것과는 차이가 있습니다.


이러한 인터프리터의 특성을 유지하기 위해 GIL이라는 매커니즘이 적용되어 있으며


이는 파이썬이 스레드가 다른 언어처럼 그대로 적용되지는 않는다는 단점을 보이게 됩니다.



단, 파이썬의 스레드를 이용하는데 있어서 장점은 두가지로 책에 설명되어 있습니다.




1. 멀티스레드를 이용하면 프로그램이 동시에 여러작업을 하는 것처럼 보이기 용이하다.


2. 특정 유형의 시스템 호출을 수행할 때 일어나는 블록킹 I/O를 다루기 위해서다.

(위의 설명 처럼 socket의 recv같은 경우)





이러한 이유로 파이썬의 스레드는 성능의 개선보다는 병렬성이 아닌 병행성을 특징으로 사용하는 것이 옳습니다.


그렇다면 기존에 원한 병렬성(즉, 성능의 개선)을 위해서는 파이썬의 multiprocessing을 이용해야 할 것입니다.


스레드는 하나의 프로세스에 여러 작업을 병렬작업 하는것처럼 하게끔 운영체제가 일정 자원을 할애하는 반면


멀티프로세싱은 멀티코어를 백분활용하는 기법입니다. 스레드는 하나의 코어만 사용한다 할 수 있겠습니다.




이를 위해 파이썬이 multiprocessing을 공부할려 하는데 큰 문제에 봉착하였습니다.


현재 3.6버전을 이용중에 있는데 python reference에는 최신버전이 적용되어 있지 않습니다.


심지어 stackoverflow같은 사이트에도 예전 버전의 설명만 올라와 있구요


직접 stackoverflow에 질문을 올리던가 해서 이 문제를 해결하고 포스팅을 해야겠습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함