Python의 스레드에서 반환 값 얻기

Dr. Muhammad Abdullah 2023년6월21일
  1. Python에서 멀티스레딩을 사용하는 HelloWorld 프로그램
  2. Python의 스레드에서 실행되는 함수에서 반환 값 얻기
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)을 정의했으며 nameid라는 두 개의 인수를 받습니다. 우리는 Thread 클래스에서 args를 사용하여 이러한 인수를 튜플로 전달했습니다.

두 개의 Thread 클래스 개체를 만들고 args=("Thread 1", 1)args=("Thread 2", 2) 인수를 각각 thread_1thread_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_argureturn_val의 두 인수를 수신하는 first_function 함수를 정의했습니다. first_functionfirst_argu의 값을 표시하고 return_val0 인덱스에 반환 값을 배치합니다.

Thread 클래스를 사용하여 스레드를 생성하고 args=("Thread 1", return_val_from_1) args=("Thread 2", return_val_from_2) 목록을 포함한 두 개의 인수를 각각 thread_1thread_2에 전달합니다. return_val_from_1return_val_from_2는 함수에서 값을 가져오는 데 사용됩니다.

thread_1.join()thread_2.join()은 메인 프로그램이 두 스레드를 완료하기를 기다리는 데 사용됩니다.

위의 코드 조각에 대한 출력을 살펴보겠습니다.

Python 스레딩 반환 값 - 출력 1

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라는 사용자 지정 클래스를 정의합니다. runjoin 방법을 재정의합니다.

스레드를 생성하고 시작하면 first_function의 반환 값이 join() 메서드에서 반환됩니다.

다음 코드의 출력은 다음과 같습니다.

Python 스레딩 반환 값 - 출력 2

관련 문장 - Python Threading