Lock을 사용하는 스레드 동기화 방법

두 개 이상의 스레드가 하나의 공통 자원에 액세스하려고하면 문제가 발생하는 경우가 있습니다. 만약 해당 자원이 내부 속성이 변하지 않는 객체라면 문제될 것이 없겠습니다만, 내부 속성이 변경이 가능하다면 상황이 달라집니다. 예를 들어 두 개의 스레드 A, B 가 공통된 변수 i 에 접근하는 상황을 가정해봅시다.

i를 상수로 가정하고 그 어떤 스레드에서도 변경하지 않는다면 A, B 스레드는 언제든 i에 접근하여 그 값을 읽을 수 있고, 이 때 i의 정보가 손상되지 않을 것이라 확신할 수 있습니다.

하지만 i 값 자체가 바뀌거나, i가 참조하고 있는 객체의 내부 상태가 바뀔 수 있다면 어떨까요? 스레드 A가 i의 값을 변조하고, 스레드 B가 i의 값을 참조하는 상황을 가정해봅시다. A가 어느시점에 i의 값을 변조하는데, 이와 동시에 스레드 B의 코드 여러 줄에서 i의 값을 반복적으로 참조한다면, B의 입장에서는 아무짓도 하지 않았지만 바로 윗줄에서의 i와 지금 라인에서의 i가 다른 값일 수 있다는 예측할 수 없는 상황에 놓이게 됩니다.

Lock을 사용하는 스레드 동기화 방법 더보기

ZMQ + Asyncio 적용하기

파이썬에서 ZMQ를 사용할 때, asyncio를 사용할 수 있게 되었다. asyncio에 적용한다고 해서 크게 달라지는 것은 없고 소켓의 사용방법은 대동소이하다. (실제 IO 시점에 작업 전환이 일어날 수 있게 await를 붙이는 것 정도의 차이만 있다. 대략의 사용법을 정리해보면 다음과 같다.

ZMQ + Asyncio 적용하기 더보기

코코아 뷰 애니메이션 구현하기

코코아 애니메이션 가이드에서는 뷰를 Layer-Backed 뷰로 만든다음, 뷰의 레이어(CALayer)의 속성을 변경하면, CALayer에 의해서 암시적으로 해당 속성이 변경되는 동작이 애니메이팅된다고 한다. 하지만 실제로 이를 써보면 안된다. 그래서 조금 찾아보았더니 두 가지 문제가 있었다.

코코아 뷰 애니메이션 구현하기 더보기

Selector를 사용한 소켓 멀티플렉싱

zmq.Poller는 소켓을 멀티플렉싱할 때 사용하는 클래스입니다. 파이썬에서의 ZMQ Poller 구현은 파이썬의 내부 select 모듈을 사용합니다. 파이썬 3.4부터는 이 모듈을 개선하여 효율적인 I/O 멀티플렉싱에 대한 고수준 API를 제공하는 selectors 모듈이 있습니다.

selectors.BaseSelector는 복수 파일 객체에 대한 I/O 이벤트를 대기하기 위해 사용합니다. 이 클래스는 파일 스트림에 대한 등록, 해제와 대기에 관한 메소드들을 제공하며, selectors 모듈이 제공하는 여러 셀렉터 클래스들의 기반이 됩니다.

Selector를 사용한 소켓 멀티플렉싱 더보기