2012년 1월 24일 화요일

파이썬 yield (2) - yield는 언제 사용하는가.

파이썬 yield에 대해서 부가적으로 써보겠습니다.

 왜 yield를 사용하느냐,,,

 이것을 왜 코루틴으로 사용하는가..? 대한 답입니다.

 함수는 기본적으로 실행이 종료 되면, 그 안의 모든 로컬 변수들은 날라가 버립니다.

 함수라는 것 자체가 기본적으로 휘발성이기때문에, 날라가 버리죠,, 

그래서 날라가는 것을 방지하기 위해서 global로 선언을 해버립니다.

 교과서에서는 global로 선언하는 것은 후진 방법이라고 써져있습니만,

 실제로은 후진방법은 아닙니다. 다만, 그 사이드 이펙트가 컨트롤 할 수 없을 정도로 복잡해지기에, 쓰지말라고 하는것이죠,,

실제로는 많이들 사용합니다. 왜냐하면 중앙 변수를 건드리는게 편하니깐요,

 yield는 그럼 무엇일까요,, 기본적으로 함수이지만, 휘발성이 없는 함수입니다.

 실행이 끝난다고 , 날라가 버리지 않지요,, global하게 살아 있는 함수인것입니다.

 함수 실행중에 잠시 세워놓고 딴짓거리를 해도 변수나 이런게 다 살아 있습니다.

 이게 무엇을 얘기하느냐,, 멀티프로세싱의 기본이 되는것이죠,, 일종의 thread입니다.

다만, 실제로 real time multi-thread가 아니라, turn 방식의 thread, 게임으로 말하면 스타크래프트 같은것이 실시간으로 다른 task들을 처리하는 반면에 삼국지,HMM 스타일은 실시간으로 처리를 하지 않고, 턴 방식으로 처리를 합니다.

 서로 간의 장단점이 있습니다만, 턴방식의 장점은, 그리 많은 프로세서 파워를 요구하지 않죠,, 이것도 yield에서도 마찬가지 입니다. 다양한 멀티 작업들을 돌릴때, 한번에 하나씩 돌리면서, synchronous하게 움직이죠,, 그러면서 , 실시간 처리하면서 생기는 asynchronous의 문제들이 사라집니다. 좀더 세밀하게 컨트롤 할 수도 있고요,,, 이것이 yield의 장점입니다.

 활용처는 이 기본적인 차이를 알고 계시면 충분히 활용은 쉬우리라 봅니다.