Python의 스레드에서 반환 값 얻기
이 기사에서는 먼저 스레드 기본 사항과 Python에서 스레드를 시작하기 위한 코드에 대해 설명합니다. 그런 다음 스레드에서 실행되는 함수에서 값 반환을 가져오는 코드에 대해 설명합니다.
스레드는 자체 프로그램 실행 상태가 있는 프로세스 내의 경량 실행 단위입니다. 프로세스는 동시성(경우에 따라 병렬성)을 달성하기 위해 여러 스레드를 실행합니다.
프로세스와 스레드의 주요 차이점은 각 프로세스에는 별도의 분리된 주소 공간이 있는 반면 동일한 프로세스의 여러 스레드는 단일 프로세스의 동일한 주소 공간을 공유한다는 것입니다. 이는 스레드가 추가 파이프(일반 파이프 또는 FIFO) 또는 메시지 전달 인터페이스 없이 공유 메모리를 사용하여 통신할 수 있음을 의미합니다.
Python에서 멀티스레딩을 사용하는 HelloWorld
프로그램
다음 코드를 고려하십시오.
from threading import Thread
# A function for threads.
def first_function():
print("Hello World")
print("main program start")
thread_1 = Thread(target=first_function)
thread_2 = Thread(target=first_function)
thread_1.start()
thread_2.start()
print("main ends")
위의 코드에서는 먼저 from threading import Thread
문을 사용하여 Thread
클래스를 가져와서 멀티스레딩을 사용하도록 했습니다. 우리는 Hello World
를 표시하는 first_function()
함수를 정의하고 Thread()
클래스를 사용하여 스레드를 인스턴스화했습니다.
실행할 target
함수로 first_function()
을 전달하여 Thread()
클래스의 두 인스턴스를 생성했습니다. target
속성은 Thread()
에 의해 실행될 함수를 지정합니다.
Thread()
인스턴스가 생성되면 .start()
메서드를 사용하여 이러한 스레드를 실행하고 실행할 수 있습니다.
스레드에서 실행되는 함수에 인수 전달
다음 코드를 고려하십시오.
from threading import Thread
def first_function(name, id):
print("Hello World from ", name, " ID= ", id)
thread_1 = Thread(target=first_function, args=("Thread 1", 1))
thread_2 = Thread(target=first_function, args=("Thread 2", 2))
thread_1.start()
thread_2.start()
위의 코드에서 우리는 함수 first_function(name, id)
을 정의했으며 name
과 id
라는 두 개의 인수를 받습니다. 우리는 Thread
클래스에서 args
를 사용하여 이러한 인수를 튜플로 전달했습니다.
두 개의 Thread
클래스 개체를 만들고 args=("Thread 1", 1)
및 args=("Thread 2", 2)
인수를 각각 thread_1
및 thread_2
에 전달했습니다. 또한 thread_1.start()
및 thread_2.start()
는 이러한 스레드를 실행하는 데 사용됩니다.
Python의 스레드에서 실행되는 함수에서 반환 값 얻기
스레드에서 실행 중인 함수에서 반환 값을 가져오는 방법에는 여러 가지가 있습니다.
가변 객체를 함수에 전달
변경 가능한 개체를 함수에 전달하여 스레드에서 실행되는 함수에서 값을 얻을 수 있습니다. 함수는 해당 개체에 반환 값을 배치합니다. 다음 코드를 고려하십시오.
from threading import Thread
def first_function(first_argu, return_val):
print(first_argu)
return_val[0] = "Return Value from " + first_argu
return_val_from_1 = [None] * 1
return_val_from_2 = [None] * 1
thread_1 = Thread(target=first_function, args=("Thread 1", return_val_from_1))
thread_2 = Thread(target=first_function, args=("Thread 2", return_val_from_2))
thread_1.start()
thread_2.start()
thread_1.join()
thread_2.join()
print(return_val_from_1)
print(return_val_from_2)
위의 코드는 first_argu
및 return_val
의 두 인수를 수신하는 first_function
함수를 정의했습니다. first_function
은 first_argu
의 값을 표시하고 return_val
의 0
인덱스에 반환 값을 배치합니다.
Thread
클래스를 사용하여 스레드를 생성하고 args=("Thread 1", return_val_from_1)
및 args=("Thread 2", return_val_from_2)
목록을 포함한 두 개의 인수를 각각 thread_1
및 thread_2
에 전달합니다. return_val_from_1
및 return_val_from_2
는 함수에서 값을 가져오는 데 사용됩니다.
thread_1.join()
및 thread_2.join()
은 메인 프로그램이 두 스레드를 완료하기를 기다리는 데 사용됩니다.
위의 코드 조각에 대한 출력을 살펴보겠습니다.
join
방법 사용
join
메서드는 스레드에서 실행 중인 함수에서 반환 값을 가져오는 또 다른 방법입니다. 다음 코드를 고려하십시오.
from threading import Thread
def first_function(first_argu):
print(first_argu)
return "Return Value from " + first_argu
class NewThread(Thread):
def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
Thread.__init__(self, group, target, name, args, kwargs)
def run(self):
if self._target != None:
self._return = self._target(*self._args, **self._kwargs)
def join(self, *args):
Thread.join(self, *args)
return self._return
thread_1 = NewThread(target=first_function, args=("Thread 1",))
thread_2 = NewThread(target=first_function, args=("Thread 2",))
thread_1.start()
thread_2.start()
print(thread_1.join())
print(thread_2.join())
위의 코드에서는 Thread
클래스의 하위 클래스인 NewThread
라는 사용자 지정 클래스를 정의합니다. run
및 join
방법을 재정의합니다.
스레드를 생성하고 시작하면 first_function
의 반환 값이 join()
메서드에서 반환됩니다.
다음 코드의 출력은 다음과 같습니다.