[Python] Queue

2021. 3. 5. 23:00·Language/Python
반응형
Queue 24db2b0915574f12bae5794c07833b64

멀티 쓰레드 프로그래밍을 할 때 큐와 쓰레드를 혼합해 사용하면 비교적 간단하게 문제를 해결할 수 있다. 작업 큐를 만들어 처리할 작업들을 큐에 저장하고 각 쓰레드는 큐에서 작업들을 하나씩 가져와 처리하는 방식이 일반적이다. 파이썬에서는 이를 위해 멀티 쓰레드 환경에서 사용할 수 있는 Queue를 제공한다.

Queue의 핵심 함수는 아래 3개가 있다. 이외에도 qsize(), empty(), full()이 있는데 적절히 사용하면 된다.

  • put/get : 큐에 데이터를 삽입/삭제한다.
  • task_done : 큐에서 작업이 완료되었다.
  • join : 큐의 모든 작업이 끝날때까지 대기한다.

put/get은 일반적인 큐와 동일하게 데이터를 삽입하고 가져오는 함수이다. 그 이외 task_done과 join은 기존 큐에서는 볼 수 없는 함수이다. 여기서는 작업(Task)라는 용어가 나왔다. 코드를 통해 두 함수가 어떤 역할을 하는지 살펴본다.

먼저 join의 코드는 아래와 같다.

def join(self):
    with self.all_tasks_done:
        while self.unfinished_tasks:
            self.all_tasks_done.wait()

self.unfinished_tasks는 0으로 초기화되는 정수형 멤버 변수이다. join에서는 이 변수가 0이 될 때 까지 대기하는 동작을 한다. put의 코드를 보면

​x
def put(self, item, block=True, timeout=None):
                
        ...     
​
    self._put(item)
    self.unfinished_tasks += 1

큐에 데이터가 삽입될 때 마다 self.unfinished_tasks를 1 증가시킨다. 큐에 저장된 데이터의 갯수를 나타내는 변수 같지만 get 함수 정의에는 self.unfinished_tasks -= 1 처럼 감소시키는 코드가 없다. task_done 함수에서 감소 코드가 실행된다.

xxxxxxxxxx
def task_done(self):
    with self.all_tasks_done:
        unfinished = self.unfinished_tasks - 1
        if unfinished <= 0:
            if unfinished < 0:
                raise ValueError('task_done() called too many times')
            self.all_tasks_done.notify_all()
        self.unfinished_tasks = unfinished

이처럼 작성된 이유를 생각해 봤다. Queue 를 사용할 때 데이터를 큐에 넣고, 큐에 저장된 데이터를 가져와 처리하는 순으로 동작한다. 즉 데이터를 가져오기 위해서 get을 호출한 다음 가져온 데이터에 대한 작업을 수행할 것이다. 따라서 작업이 완료된 시점에 task_done을 명시적으로 호출시켜 큐에서 가져온 데이터에 대한 작업이 완료됨을 알려준다. 이를 통해 큐에서도 작업이 완료됨을 알 수 있고 join으로 종료 시점을 설정할 수 있다.

반응형
저작자표시 비영리 변경금지 (새창열림)
'Language/Python' 카테고리의 다른 글
  • [Python] Dependency Injector (1)
  • [Python] ensure_future
  • [Python] GIL
  • [Python] Flask
덴마크초코우유
덴마크초코우유
IT, 알고리즘, 프로그래밍 언어, 자료구조 등 정리
    반응형
  • 덴마크초코우유
    이것저것끄적
    덴마크초코우유
  • 전체
    오늘
    어제
    • 분류 전체보기 (121)
      • Spring Framework (7)
        • Spring (3)
        • JPA (2)
        • Spring Security (0)
      • Language (51)
        • Java (11)
        • Python (10)
        • JavaScript (5)
        • NUXT (2)
        • C C++ (15)
        • PHP (8)
      • DB (16)
        • MySQL (10)
        • Reids (3)
        • Memcached (2)
      • 개발 (3)
      • 프로젝트 (2)
      • Book (2)
      • PS (15)
        • 기타 (2)
        • 백준 (2)
        • 프로그래머스 (10)
      • 딥러닝 (8)
        • CUDA (0)
        • Pytorch (0)
        • 모델 (0)
        • 컴퓨터 비전 (4)
        • OpenCV (1)
      • 기타 (16)
        • 디자인패턴 (2)
        • UnrealEngine (8)
        • ubuntu (1)
        • node.js (1)
        • 블로그 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Unreal Engine
    Unreal
    자바
    언리얼엔진4
    redis
    JS
    파이썬
    블루프린트
    프로그래머스
    딥러닝
    게임
    알고리즘
    pytorch
    JavaScript
    map
    Python
    C
    MySQL
    php
    C++
    mscoco
    웹
    CPP
    PS
    FPS
    클래스
    게임 개발
    select
    memcached
    NUXT
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
덴마크초코우유
[Python] Queue
상단으로

티스토리툴바