Python 스레딩 대기열

Muhammad Maisam Abbas 2023년10월10일
  1. Python의 스레드
  2. Python에서 대기열로 스레드 제한
Python 스레딩 대기열

이 자습서에서는 Python의 활성 스레드 수 제한에 대해 설명합니다.

Python의 스레드

Python의 스레딩을 사용하면 단일 프로세스 내에서 여러 실행 스레드를 동시에 실행할 수 있습니다. 각 스레드는 다른 스레드와 독립적으로 실행되므로 동시 실행 및 성능 향상이 가능합니다.

스레딩은 하나의 스레드가 차단된 동안 다른 스레드가 계속 실행될 수 있도록 하므로 I/O에 바인딩되거나 실행 시간이 긴 작업을 실행하는 데 특히 유용합니다.

Python은 스레드를 만들고 관리하기 위한 내장 threading 모듈을 제공합니다. 모듈 내의 Thread 클래스를 사용하여 새 실행 스레드를 생성할 수 있으며 start() 메서드를 사용하여 스레드 실행을 시작할 수 있습니다.

join() 메서드를 사용하여 스레드가 실행을 완료할 때까지 기다릴 수 있습니다.

threading 모듈 외에도 Python은 concurrent.futures 모듈을 제공합니다. 이 모듈은 콜러블을 비동기적으로 실행하기 위한 상위 수준 인터페이스를 제공합니다. 이 모듈은 콜러블을 병렬로 실행하는 데 사용할 수 있는 작업자 스레드 풀을 만드는 데 사용할 수 있는 ThreadPoolExecutor 클래스를 제공합니다.

스레딩은 Python 프로그램의 성능을 향상시키는 강력한 도구가 될 수 있지만, 복잡성과 경쟁 조건 및 기타 동기화 문제의 가능성을 도입할 수 있으므로 주의해서 사용해야 합니다.

Python에서 대기열로 스레드 제한

Python의 Queue 클래스는 여러 스레드에서 처리해야 하는 항목을 저장하기 위한 스레드 안전 및 FIFO(선입선출) 데이터 구조를 제공합니다. 스레드 간의 데이터 흐름을 조정하고 동시에 실행할 수 있는 스레드 수를 제한하는 데 사용할 수 있습니다.

대기열을 사용하여 동시에 실행할 수 있는 스레드 수를 제한하려면 Queue 클래스 내부에서 maxsize 매개변수를 사용할 수 있습니다. 다음은 대기열을 사용하여 총 스레드 수를 제한하는 방법의 예입니다.

import threading
import queue
from queue import Queue
from threading import Thread


def function_to_be_executed():
    print(f"Thread {threading.get_ident()} is working")
    return


q = Queue(maxsize=3)

for i in range(10):
    try:
        thread = Thread(target=function_to_be_executed)
        q.put(thread, block=False)
    except queue.Full:
        q.get().join(timeout=0)
        thread = Thread(target=function_to_be_executed)
        q.put(thread, block=False)
    thread = q.get()
    thread.start()
while not q.empty():
    thread = q.get()
    thread.join(timeout=1)

출력:

Thread 140368505984768 is working
Thread 140368497592064 is working
Thread 140368505984768 is working
Thread 140368497592064 is working
Thread 140368505984768 is working
Thread 140368497592064 is working
Thread 140368514377472 is working
Thread 140368497592064 is working
Thread 140368497592064 is working
Thread 140368497592064 is working

위의 코드는 최대 크기가 3인 Queue 개체를 만듭니다. 즉, 주어진 시간에 3개의 스레드만 대기열에 있을 수 있습니다. 그런 다음 put() 메서드를 사용하여 10개의 스레드가 생성되고 대기열에 추가됩니다.

while 루프는 대기열의 스레드를 하나씩 시작하고 join() 메서드는 모든 스레드가 완료될 때까지 대기하는 데 사용됩니다.

이 예에서는 3개의 스레드만 동시에 실행 중입니다. 나머지는 실행할 기회가 생길 때까지 대기열에서 대기합니다. 필요에 따라 대기열의 최대 크기와 스레드 수를 조정할 수 있습니다.

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

관련 문장 - Python Thread