• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

ThreadPoolExecutor에서 작업중인 쓰레드가 있을때 대기할수 있는 방법이 있는지요?

23.12.23 23:17 작성 23.12.23 23:19 수정 조회수 82

0

안녕하세요.

정말 알찬 강의라 멀티프로세싱 스터디에 정말 좋은 교재가 되고 있습니다. 감사드리구요

ThreadPoolExecutor를 사용하여 코딩하는데 질문이 있습니다.

현재 저는 주식자동화 매매 관련 코딩 스터디 중인데요. ThreadPoolExecutor를 이용하여 주식주문이 동시에 체결되었을때의 병렬처리에 대하여 스터디 하고 있습니다.. 각기 다른 종목이 동시에 주문체결이 되었다면

각각의 종목에 대한 후속처리를 동시성을 적용하여 각각 다른 쓰레드를 할당하여 병렬처리를 하면 되지만. 같은 종목이 약간의 시간차(?) 거의 동시에 연속적인 체결이 된다면 이때는 병렬처리가 아닌 앞 주문에 할당된

쓰레드가 종료될때 까지 대기하고 있다가(후속작업이 꼬이지 않도록) 뒤에 체결된 주문을 처리하도록 쓰레드를 할당하는 동기적인 처리가 필요한 경우가 있습니다.

이런 경우를 처리하기 위한 별도의 메서드가 있는지요? . 아니면 별도의 코딩을 해야한다면 어떤 방식으로

코딩을 해야 하는지 문의드립니다. 감사합니다

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.12.25

안녕하세요, 인프런 AI 인턴입니다.

질라이님, ThreadPoolExecutor를 사용한 동시성 관리에 관한 질문 감사드립니다.

ThreadPoolExecutor는 작업이 도착하면 즉시 처리할 수 있는 스레드가 있을 경우 스레드에 작업을 할당하고, 스레드가 없을 경우 기본적으로 작업을 큐에 넣어 대기하도록 설계되어 있습니다. 동일한 종목에 대해 순차적으로 작업이 처리되길 원한다면, 이러한 작업을 단일 스레드 혹은 단일 작업 큐로 관리하여 처리하는 방법이 있습니다.

ThreadPoolExecutor의 작업 큐를 활용해 동일 종목에 대한 작업을 큐에 차례로 넣어주면, 큐에 있는 작업은 하나씩 차례대로 실행될 것입니다. 이 방식은 동일 종목에 대해 순차적으로 실행을 보장합니다.

또 다른 방법으로는 concurrent 라이브러리의 Lock이나 Semaphore를 사용하여 동일 종목에 대해 스레드가 수행 중인 작업이 있을 때 다른 스레드가 대기하도록 구현할 수 있습니다. Lock을 사용하여 해당 종목의 작업이 실행될 때 Lock을 획득하고, 작업이 완료된 후에는 Lock을 해제하여 다음 대기중인 작업이 실행될 수 있도록 하는 것입니다.

이러한 동기화 메커니즘은 개발자가 직접 구현해야 하며, Python의 threading 모듈을 통해 적용할 수 있습니다.

스레드 할당과 종료되기를 대기하는 로직은 별도로 설계하시어 코딩하셔야 할 것 같습니다. 예를 들어, Lock을 이용한 방식은 간략하게 다음과 같은 형태로 구현이 가능합니다:

from threading import Lock

locks = {}
locks['특정종목'] = Lock()

def 주문처리(종목):
    with locks[종목]:
        # 할당된 스레드가 종료될 때까지 작업을 진행합니다.
        # 처리할 로직

결국 종목 별로 Lock을 관리하고, 해당 Lock을 획득한 스레드만이 작업을 수행할 수 있도록 함으로써, 동기적인 처리를 구현할 수 있습니다.

이외에도 고급 동기화 기법이나 설계 패턴을 통해 구현할 수 있지만, 이는 사용하시는 언어와 프레임워크, 구체적인 요구 사항에 따라 달라질 수 있습니다.

더 자세한 구현 방법이나 고급 동기화 기법에 대해서는 해당 언어의 공식 문서나 관련 커뮤니티, 포럼 등에서 추가 자료를 찾아보시는 것을 추천드립니다.