파이썬 스레드 우선순위

Abid Ullah 2023년6월21일
  1. Python의 스레딩
  2. Python 스레드의 스케줄링 우선순위 제어
파이썬 스레드 우선순위

이 기사는 Python에서 스케줄링 스레딩을 사용하여 우선 순위로 만드는 방법을 설명하는 것을 목표로 합니다. 여기서는 Python에서 우선 순위 스레드를 예약하고 이를 좋은 예제 프로그램과 함께 사용하는 방법에 대해 설명합니다.

Python 스레딩을 사용하면 프로그램의 다른 부분을 동시에 실행할 수 있으므로 프로그램 설계가 더 쉬워집니다. Python을 알고 있다면 스레드를 사용하여 Python 프로그램 속도를 높이는 방법을 보여 드리겠습니다.

Python의 스레딩

스레딩은 여러 명령을 동시에 실행할 수 있는 기능입니다. 이 기사에서 살펴볼 때 일정을 조정하여 스레드의 우선 순위를 지정할 수 있습니다.

GIL(Global Interpreter Lock)은 Python 스레드를 구현하는 데 사용되며, 이는 스레드의 우선 순위를 제어할 수 없음을 의미합니다. 우선 순위를 사용하여 스레드를 제어하려면 암시적 우선 순위 시스템을 만들어야 합니다.

스레딩에서는 각각 독립적인 작업을 수행하는 두 개 이상의 프로세서가 프로그램에서 동시에 실행되는 것을 상상할 수 있습니다.

그것은 사실에 매우 가깝습니다. 각 스레드는 서로 다른 프로세서에서도 하나의 프로세서에서 동시에 실행됩니다.

여러 작업을 동시에 실행하려면 비표준 Python 구현이 필요하거나 코드를 다른 언어로 작성해야 하거나 추가 오버헤드가 있는 다중 처리를 사용해야 할 수 있습니다.

Python의 C 구현이 항상 스레딩을 지원하는 것은 아니므로 스레딩이 모든 작업의 속도를 높이지 못할 수도 있습니다. GIL 상호 작용은 동시에 실행할 수 있는 Python 스레드 수를 제한합니다.

일반적으로 스레딩은 외부 이벤트를 기다리는 데 많은 시간을 소비하는 작업에 적합한 선택입니다. 많은 CPU 계산이 필요하지만 외부 이벤트를 기다리는 데 거의 시간을 소비하지 않는 문제는 다른 문제만큼 빠르게 실행되지 않을 수 있습니다.

Python 스레드의 스케줄링 우선순위 제어

올바른 버전의 Python으로 작업하고 있는지 확인하는 것이 중요합니다. 이 문서에서는 특별히 버전 3.10.4를 사용하고 있습니다.

터미널에서 다음 명령어를 실행하면 현재 설치된 파이썬 버전을 확인할 수 있다.

python --version

유용한 라이브러리 가져오기

다음 단계는 스레드가 무엇인지 이해한 후 스케줄링 우선 순위를 사용하여 스레드를 만드는 방법을 배우는 것입니다. 이 기사에서 보게 될 대부분의 프리미티브는 스레딩을 통해 Python 표준 라이브러리에서 제공됩니다.

이 모듈에서 Thread는 스레드와 상호 작용하기 위한 멋진 인터페이스를 제공하여 스레드를 멋지게 캡슐화합니다.

이제 프로그램의 다음 단계로 이동하여 Python 스레드의 우선 순위를 예약하는 데 필요한 라이브러리를 가져옵니다.

예제 코드:

import time
from threading import Thread
from time import sleep

Thread 인스턴스를 사용하고 .start()에 전달하여 별도의 스레드를 시작할 수 있습니다.

예제 코드:

import logging
import threading
import time


def the_thread_function(name):
    logging.info("The thread %s: Beginning now", name)
    time.sleep(2)
    logging.info("The Thread %s: Ends", name)


if __name__ == "__main__":
    format = "%(asctime)s: %(message)s"
    logging.basicConfig(format=format, level=logging.INFO, datefmt="%H:%M:%S")
    logging.info("Main    : Now before creating a thread")
    x = threading.Thread(target=the_thread_function, args=(1,))
    logging.info("Main    : Earlier than running threading")
    x.start()
    logging.info("Main    : Now wait for the thread to End")
    # x.join()
    logging.info("Main    : All Finish")

출력:

17:06:51: Main    : Now before creating a thread
17:06:51: Main    : Earlier than running threading
17:06:51: The thread 1: Beginning now
17:06:51: Main    : Now wait for the thread to End
17:06:51: Main    : All Finish
17:06:53: The Thread 1: Ends

로깅 문에서 메인 섹션이 스레드를 만들고 시작하고 있음을 알 수 있습니다. 스레드에 인수 목록과 호출하려는 함수를 전달하여 스레드를 만듭니다.

이 경우 Threadthread_function()을 실행하고 인수로 1을 전달하라는 지시를 받습니다.

파이썬에서 많은 스레드로 작업하기 스케줄 우선순위

현재 예제 코드는 메인 스레드와 스레딩 Thread 개체로 시작한 스레드의 두 스레드에서만 작동합니다. 종종 많은 스레드를 시작하여 흥미로운 작업을 수행하게 하고 싶을 것입니다.

다음으로 더 쉬운 방법을 살펴보겠습니다. 더 어려운 방법부터 살펴보겠습니다.

예제 코드:

import logging
import threading
import time


def thread_function(name):
    logging.info("Thread %s: Beginning", name)
    time.sleep(2)
    logging.info("Thread %s: Ending", name)


if __name__ == "__main__":
    format = "%(asctime)s: %(message)s"
    logging.basicConfig(format=format, level=logging.INFO, datefmt="%H:%M:%S")
    threads = list()
    for index in range(3):
        logging.info("Main    : create and start thread %d.", index)
        x = threading.Thread(target=thread_function, args=(index,))
        threads.append(x)
        x.start()
    for index, thread in enumerate(threads):
        logging.info("Main    : Before joining thread %d.", index)
        thread.join()
        logging.info("Main    : thread %d end", index)

출력:

17:09:01: Main    : create and start thread 2.
17:09:01: Thread 2: Beginning
17:09:01: Main    : Before joining thread 0.
17:09:03: Thread 0: Ending
17:09:03: Main    : thread 0 end
17:09:03: Main    : Before joining thread 1.
17:09:03: Thread 1: Ending
17:09:03: Main    : thread 1 end
17:09:03: Main    : Before joining thread 2.
17:09:03: Thread 2: Ending
17:09:03: Main    : thread 2 end

Thread 객체를 생성한 다음 .start()를 호출하여 이전에 스레드를 시작한 것과 같은 방식으로 스레드를 시작합니다. Thread 객체 목록을 유지하면 프로그램이 나중에 .join()을 사용하여 대기할 수 있습니다.

출력을 주의 깊게 살펴보면 세 개의 스레드가 모두 예상한 순서대로 시작된다는 것을 알 수 있습니다. 그러나이 경우 반대 순서로 끝납니다!

여러 번 실행하면 다른 주문이 생성되고 출력됩니다. Thread x: Nearing End 메시지를 찾아 각 Thread가 언제 끝날지 알려줍니다.

운영 체제는 스레드가 실행되는 순서를 결정하는데 이는 예측하기 매우 어렵습니다. 알고리즘에서 스레딩을 사용하는 것은 실행마다 다를 수 있으므로 알고리즘을 개발할 때 이를 염두에 두십시오.

Python이 스레드를 조정하고 스레드를 서로 조정하기 위한 몇 가지 프리미티브를 제공한다는 것은 대단한 일입니다. 먼저 스레드 그룹을 더 쉽게 관리하는 방법을 살펴보겠습니다.

Worker 클래스 생성

worker 클래스를 사용하면 각 스레드가 실행 시간을 가질 수 있도록 스크립트를 설정할 수 있습니다. 결과의 형태로 하나의 스레드가 더 높은 우선 순위를 가지면 다른 스레드를 더 오래 잠들게 할 것입니다.

Worker 클래스는 다중 스레딩을 지원하는 간단한 MFC 클래스입니다. 스레드가 작업을 수행해야 하는 모든 개체는 Worker 클래스에서 상속됩니다.

Do-Work 기능을 사용하여 긴 프로세스를 실행한 다음 개체에서 Start/Stop/Pause를 사용하여 수행합니다.

예제 코드:

import time
from threading import Thread
from time import sleep


class Worker(Thread):
    def __init__(self, pri):
        Thread.__init__(self)
        self.pri = pri

    def run(self):
        for i in range(20):
            sleep(1.0 * self.pri)
            print(" -thread with priority:", self.pri)


w1 = Worker(1.0)
w2 = Worker(0.75)
w3 = Worker(0.5)
start = time.time()
w1.start()
w2.start()
w3.start()
end = time.time()

이 단계의 일부로 작업자를 초기화했습니다. 그런 다음 우선 순위가 다른 여러 스레드를 만들었습니다.

작업자 스레드는 이제 다음과 같이 실행됩니다.

Output exceeds the size limit. Open the full output data in a text editor
 -thread with priority: 0.5
 -thread with priority: 0.75
 -thread with priority: 1.0
 -thread with priority: 0.5
 -thread with priority: 0.75
 -thread with priority: 0.5
 -thread with priority: 1.0
 -thread with priority: 0.5
 -thread with priority: 0.75
 -thread with priority: 0.5
 -thread with priority: 1.0
 -thread with priority: 0.75

평균적으로 스레드 실행의 출력 추적을 보면 우선 순위가 0.5 및 0.75인 스레드가 실행 후 우선 순위가 1.0인 스레드보다 더 자주 호출되었음을 알 수 있습니다.

다음 예제는 간단한 Python 스크립트가 우선 순위에 따라 Python 스레드를 예약하는 방법을 보여줍니다.

우리는 이제 Python 스레딩의 몇 가지 예와 많은 스레드가 있는 스레드 프로그램을 빌드하는 방법, 스케줄링 우선 순위 및 해결하는 문제를 살펴보았습니다. start(), join(), time(), worker 클래스 및 기타 여러 메소드의 사용도 시연되었습니다.

이 기사가 Python에서 스레드를 사용하는 방법을 이해하는 데 도움이 되기를 바랍니다.

작가: Abid Ullah
Abid Ullah avatar Abid Ullah avatar

My name is Abid Ullah, and I am a software engineer. I love writing articles on programming, and my favorite topics are Python, PHP, JavaScript, and Linux. I tend to provide solutions to people in programming problems through my articles. I believe that I can bring a lot to you with my skills, experience, and qualification in technical writing.

LinkedIn

관련 문장 - Python Thread