Home » queue

queue

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

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

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

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

스레드를 이용한 데몬 만들기 – Python

이 블로그를 통해서 파이썬에서의 병렬처리에 대해서는 명시적으로 threading.Thread 대신에 concurrent.futures 에서 제공하는 API를 사용할 것을 여러 차례 권장해 왔다. 여기서 주목할 것은 바로 “병렬처리”라는 조건이다. 즉 concurrent.futures의 API는 일련의 데이터에 대해서 동일한 처리를 하려할 때, 이 “동일한 처리”를 여러 스레드 혹은 프로세스로 나눠서 동시에 진행하는 상황에 어울리는 기능이다. 하지만 실제 상황에서는 동시에 서로 다른 작업이 진행되어야 하는 경우가 존재한다.주로 메인 스레드와 백그라운드 스레드 (혹은 작업 스레드)에서 하는 일이 서로 다른 경우에 이러한 패턴이 필요할 수 있다. 이번 글에서는 파이썬의 threading… 더 보기 »스레드를 이용한 데몬 만들기 – Python

ZMQ 디바이스 사용하기

일반적인 소켓 연결의 경우, 주로 서버는 bind()를 통해서 포트에 연결하고 클라이언트는 connect()를 사용해서 포트에 연결한다. ZMQ에서는 이 방식이 절대적인 규칙이 아니다. 간단한 소켓 통신의 예에서 양 끝단 중 상대적으로 안정적인 쪽이 서버인 경우가 많기 때문에 bind() 하는 것이며 클라이언트는 서버보다는 동적이기 때문에 connect() 하는 경우가 많을 뿐이다. 간단한 피어 통신의 예제에서는 사실 양 끝단이 모두 ‘고정’되어 있고, ZMQ에서는 연결의 순서에 구애받지 않으므로 클라이언트가 bind()를 하고 서버가 connect()를 해도 문제 없다. 유념해야하는 원칙 한가지는 안정적인 쪽이 bind()를, 그렇지 않은 쪽이 connect()를… 더 보기 »ZMQ 디바이스 사용하기