Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python의 스레드 기반 병렬 처리

<시간/>

컴퓨터 과학의 스레드는 운영 체제의 일부인 스케줄러에 의해 독립적으로 관리될 수 있는 일련의 명령입니다.

스레딩의 주요 기능은 한 번에 여러 스레드를 실행하는 것입니다. 스레드는 다른 작업, 프로그램의 함수 호출 및 여러 스레드가 동시에 실행되는 것을 의미하지만 다른 시스템에서 실행된다는 의미는 아닙니다.

멀티스레딩은 두 가지 경우에 사용됩니다.

  • 서브 프로그램의 출력이 메인 프로그램과 결합되어야 하는 경우.

  • 메인 프로그램이 서로 상대적으로 독립적인 코드 조각을 포함하는 경우.

스레딩 모듈

Python은 매우 강력하고 스레드에 대한 높은 수준의 지원도 제공하는 Threading 모듈을 제공합니다.

Threading 모듈은 스레드 관련 데이터를 얻기 위해 사용되는 많은 함수를 정의하며 이러한 함수는 자동으로 실행됩니다.

threading.active_count()

이 함수는 현재 살아있는 Thread 객체의 수를 반환합니다. 여기서 반환된 개수는 enumerate()가 반환한 목록의 길이와 같습니다.

threading.current_thread()

이 함수는 현재 Thread 개체를 반환하며 호출자의 제어 스레드에 해당합니다.

threading.get_ident()

이 함수는 현재 스레드의 '스레드 식별자'를 반환합니다. 0이 아닌 정수입니다.

threading.enumerate()

이 함수는 데몬 스레드를 포함하여 현재 살아있는 모든 Thread 객체의 목록을 반환하고, current_thread() 함수는 더미 스레드와 메인 스레드를 생성하고 종료된 스레드와 아직 시작되지 않은 스레드를 제외합니다.

threading.main_thread()

이 함수는 기본 Thread 개체를 반환합니다.

threading.settrace(func)

스레딩 모듈에서 모든 스레드가 시작되면 추적 기능을 설정합니다. run() 메서드가 호출되기 전에 이 함수는 각 스레드에 대해 sys.settrace()에 전달됩니다.

threading.setprofile(기능)

threading 모듈에서 모든 스레드가 시작되면 프로필 기능을 설정합니다. run() 메서드가 호출되기 전에 이 함수는 각 스레드에 대해 sys.setprofile()에 전달됩니다.

threading.stack_size([크기])

이 함수는 스레드 스택의 크기를 반환하며 새 스레드를 생성할 때 사용됩니다.

스레딩.TIMEOUT_MAX

차단 함수(Lock.acquire(), RLock.acquire(), Condition.wait() 등)의 timeout 매개변수에 허용되는 최대값을 갖는 상수입니다.

예시 코드

import threading
def trace_function():
   print("Passing the trace function")
   def profile():
      print("PROFILE THREAD: " + str(threading.current_thread().getName()))
      class mythread(threading.Thread):
      def __init__(self, thread_name, thread_ID):
         threading.Thread.__init__(self)
         self.thread_name = thread_name
         self.thread_ID = thread_ID
      def run(self):
         print(str(self.thread_ID));
         print("ACTIVE THREADS ARE: "+ str(threading.active_count()))
         print("CURRENT THREAD IS: " + str(threading.current_thread().getName()))
         my_thread1 = mythread("PP", 500)
         my_thread2 = mythread("PythonProgram", 1000);
         print("NAME OF THE MAIN THREAD: " + str(threading.main_thread().getName()))
         print("IDENTIFICATION OF MAIN THREAD: "+ str(threading.get_ident()))
         print("STACK SIZE = " + str(threading.stack_size()))
      print(threading.settrace(trace_function()))
   threading.setprofile(profile())
my_thread1.start()
my_thread2.start()
print("LIST OF ENUMERATION: ")
print(threading.enumerate())
print("EXIT")

출력

NAME OF THE MAIN THREAD: MainThread
IDENTIFICATION OF MAIN THREAD: 5436
STACK SIZE = 0
Passing the trace function
None
PROFILE THREAD: MainThread
500
1000LIST OF ENUMERATION: ACTIVE THREADS ARE: 6
[<_MainThread(MainThread, started 5436)>, <Thread(Thread-4, started daemon 1960)>, <Heartbeat(Thread-5, started daemon 6452)>, <HistorySavingThread(IPythonHistorySavingThread, started 4304)>, <mythread(Thread-8, started 8460)>, <mythread(Thread-9, started 4668)>]
EXIT

CURRENT THREAD IS: Thread-8

ACTIVE THREADS ARE: 5
CURRENT THREAD IS: Thread-9