ZMQ 프록시 사용하기

ZMQ 디바이스를 사용하여 네트워크를 확장하는 예를 살펴본 적이 있었는데, zmq.device()는 이제 deprecated 되었고 대신에 zmq.proxy()를 사용하라는 내용을 공식문서에서 보게 되었다. 단지 device에서 proxy로 이름이 바뀐 것인가 싶었는데, 프록시는 zmq 디바이스보다 좀 더 오픈되고 유연한 형태의 네트워크 중계 장치이며, 사용도 더 간편하기 때문에 소개하고자 한다.

ZMQ 프록시 사용하기 더보기

(Python) prompt_toolkit 사용법

prompt_toolkit은 xNIX 계열의 쉘에서 사용되는 readline 라이브러리를 순수 파이썬으로 구현한 것으로 명령줄 도구를 사용할 때 히스토리 탐색이나 자동 추천, 자동 완성등의 기능을 쓸 수 있게 해주는 라이브러리이다. readline 자체가 제공하는 기능이 워낙 다양하고 유용하기 때문에 대화형 쉘과 같은 프로그램을 매우 쉽게 만들 수 있게 해준다. prompt toolkit의 제작자는 이 라이브러리의 기능을 활용하여 ptpython이라는 개선된 파이썬 대화형 쉘을 제작하였으며, vim의 기능을 흉내낸 pyvim 프로젝트도 개발하고 있다. (공식문서보기)

prompt_toolkit은 입력 프롬프트 상에서 표시되는 내용과 입력에 대한 검증을 실시간으로 가능하게 하기 때문에, 입력을 특정한 규격에 맞춰야 하는 프로그램에서 아주 유용하다. 또한 텍스트에 컬러를 지정하는 것도 가능하며, 입력 중인 내용에 대해 구문 강조를 적용하는 것도 가능하기 때문에 예쁜 CLI 프로그램을 만드는데 도움을 준다.

오늘은 prompt_toolkit에 대해 좀 알아보도록 하자.

(Python) prompt_toolkit 사용법 더보기

matplotlib의 기본 사용법 및 다른 시각화 라이브러리

오늘은 파이썬의 시각화 부분에서 가장 널리 쓰이고 있는 matplotlib에 대해서 알아보도록 하자.

matplotlib을 사용할 때 주로 서브패키지인 pyplot을 사용한다. pyplot은 MATLAB의 인터페이스와 유사하게 작동할 수 있도록 하여 MATLAB을 사용하는 사용자층이 쉽게 matplotlib으로 옮겨오도록 하고 있다. 문제는 MATLAB의 인터페이스가 그모양이어서 그런지 모르겠는데, matplotlib의 인터페이스가 일관성도 없는 편이고 그다지 객체지향적이지도 않아서 사실상 API 문서만으로도 사용이 어렵고 관련 예제를 보면서 코드를 따라써야 하는 수준으로 처리해야 하는 경우가 많다는 것이다.

matplotlib의 기본 사용법 및 다른 시각화 라이브러리 더보기

파이썬으로 이진 탐색 구현하기

이진 탐색(binary search)은 정렬된 데이터에서 특정한 값을 아주 빠르게 찾는 방법이다. N개의 데이터 중에서 특정한 값 x를 찾을 때, 최악의 경우 N번의 비교가 필요한데, 이진 탐색의 경우 최대 log_{2}N만큼의 비교를 하게 된다. 즉 자료의 크기가 클수록 선형 탐색에 비해 성능이 매우 우수해진다. 다만 이진 탐색은 자료가 정렬되어 있다는 전제가 필요하다. (이 때문에 컴퓨터 과학에서는 정렬이 매우 중요하고, 성능이 좋은 정렬 알고리듬을 만들기 위해 많은 노력이 있어왔다.)

파이썬으로 이진 탐색 구현하기 더보기

컨디션을 통한 스레드 동기화 예제

동시성을 다룰 때에는 특정한 자원을 동시에 액세스하지 못하도록 관리하거나 여러 작업들이 시작되는 시점을 맞추는 동기화 수단이 필요할 수 있다. Lock은 특정 코드 영역을 동시에 여러 스레드가 실행하지 못하도록 보호할 때 사용하며, 이벤트는 여러 스레드들이 특정 이벤트가 발생할 때까지 기다리다가 동시에 시작될 수 있도록 한다. 컨디션(Condition)은 락과 이벤트가 결합되어 있는 동기화 수단이다.

컨디션은 락을 내재하고 있는 이벤트라 할 수 있다. 락과 마찬가지로 acquire() ~ release() 구간이 있어 한 번에 하나의 스레드/프로세스가 실행되는 영역을 만들 수 있는데, 그 사이에 wait()를 통해서 이벤트를 기다릴 수 있다. 이때 한 스레드가 락을 잠근 상태에서 wait()를 호출하여 이벤트를 기다리게 되면, 같은 컨디션 객체를 점유하고자 하는 스레드가 다시 락을 얻어서 크리티컬 영역에 진입할 수 있다. 이와 같은 방식으로 여러 스레드가 크리티컬 영역에서 이벤트를 기다리는 상태가 될 때, 누군가가 해당 컨디션 이벤트를 set()하게 되면 대기 중인 모든 스레드가 깨어나게 된다. 하지만 이들은 모두 같은 크리티컬 영역에서 대기 중이었기 때문에 일반 이벤트와 달리 한꺼번에 동시에 시작하지 않고, 한 번에 하나씩 크리티컬 영역의 코드를 실행한다. 깨어난 스레드가 락을 릴리즈하는 시점에 wait()를 끝낸 다른 스레드가 실행되는 식으로 순차적으로 크리티컬 구간을 지나게 된다.

컨디션을 통한 스레드 동기화 예제 더보기