콘텐츠로 건너뛰기
Home » concurrent

concurrent

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

아래는 어떤 “counter”라는 자원을 두 스레드가 동시에 사용하려할 때, Lock을 사용하는 상황을 시각적으로 묘사한 것입니다. 두 워커 스레드 A, B 는 자원에 접근하기 전에 Lock을 획득하려고 시도합니다. 두 스레드 모두 락 객체의 .acquire()를 호출합니다. 이 때 (아마도 간발의 차이로) A 가 락을 획득하게 되었다고 가정하면, A에서 호출한 .acquire()는 즉시 리턴되어 A는 다음 코드를 진행하게 되고 여기서 counter를 사용합니다. 반면 B의 .acquire() 호출은 락을 획득할 때까지 대기하기 때문에 B의 진행 흐름은 여기서 멈추게 되고, A가 자원을 쓰는 동안 . . .… 더 보기 »Lock을 사용하는 스레드 동기화 방법

GCD in Swift

GCD in Swift

Swift에서도 GCD를 여전히 쓸 수 있다. 먼저 dispatch_async 함수는 Objective-C 에서는 아래와 같이 쓴다.

void dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

똑같은 방식으로 swift에서도 아래와 같이 정의된다.

func dispatch_async(queue:dispatch_queue_t!, block: dispatch_block_t!)

물론 swift에서 코드 블럭은 클로져이고, trailing closure 문법을 이용하면 보통은

dispatch_async(dispatch_get_main_queue()){
    println("Currently dispatched asynchronously.")
}

이런 식으로 쓸 수 있다.더 보기 »GCD in Swift

파이썬의 새로운 병렬처리 API – Concurrent.futures

컴퓨터 프로그램이 어떤 일을 처리해 나가는 실행 흐름은 기본적으로 선형이다. 서브루틴을 실행하는 것은 실질적으로 현재의 실행흐름이 해당 루틴의 단계까지 내려갔다가 다시 복귀하는 것이며, 하나의 CPU는 마치 고속도로에서 차선을 바꿔타듯 코드를 진행하며 작업을 처리해나간다. 하지만 두 개의 차선에서 동시에 다른 작업이 진행되어야 하는 상황이 언젠가는 필요할 수 있을 것이다.

이전에는 이것을 ‘동시성’이라 불렀고, 파이썬에서는 기본적으로 threading.ThreadMultiprocessing.Process 를 이용해서 다중 스레드 및 다중 프로세스를 통해서 동시성 작업을 처리했다. 이들 라이브러리 이전에 _thread 라는 저수준 API가 존재했었지만, 지금은 잊어도 좋을 것 같다.

파이썬 3.2에서는 ‘동시성’에 관한 개념을 발전시킨 고수준 API를 제공하여 더 나은 형태의 코드를 작성할 수 있게끔해주는데, 그것이 바로 오늘 소개할 concurrent.futures 라이브러리이다.

이 새로운 API는 기존의 멀티스레드 관련 API를 완전히 대체하지는 않는다. concurrent 모듈은 여전히 내부적으로 _thread와 같은 기존 API에 의존하고 있는 것도 사실이며, 스레드나 프로세스를 저수준에서 세세하게 제어하는 수단을 모두 제공하지도 않는다.

다만 주목할 것은 자바스크립트의 Promise 개념과 비슷한 Future라는 개념을 도입했고, 결과적으로 분산처리 및 그외 동시성에 관련된 코드를 좀 더 편하게 작성할 수 있게 해준다.

더 보기 »파이썬의 새로운 병렬처리 API – Concurrent.futures

[iOS/OSX] 특정 작업을 병렬로 처리하기

“동시에 진행되는 작업”을 처리하기 위해서는 iOS 및 OSX 환경에서는 크게 두 가지 방법을 (흔히) 사용한다. GCD (dispatch queue)와 Operation Queue가 그것이다. 오퍼레이션 큐는 GCD의 Objective-C 버전이라 할 만큼 비슷한데 (사실 좀 다르기는 다르다) 어쨌거나 이 두 가지 방법은 스레드의 생성과 관리를 시스템이 알아서 처리해주는 레벨로 가지고 내려가기 때문에 실제로 프로그래머가 신경써야 할 부분을 “동시에 진행되는 작업을 처리”하는 부분에만 집중하면 되도록 해준다. 예를 들면 네트워크를 통해 데이터를 로드해야 하는 경우나 그 반대로 네트워크를 통해 데이터를 저장해야 하는 경우에 응답이 느리다면 (이는… 더 보기 »[iOS/OSX] 특정 작업을 병렬로 처리하기