>  기사  >  백엔드 개발  >  Python에서 스레드 반환 값을 얻는 세 가지 방법

Python에서 스레드 반환 값을 얻는 세 가지 방법

WBOY
WBOY앞으로
2023-04-13 10:43:092107검색

스레드에 관해서는 우리의 뇌가 다음과 같은 인상을 받아야 합니다. 스레드가 시작되는 시점은 제어할 수 있지만 종료되는 시점은 제어할 수 없습니다. 그렇다면 스레드의 반환 값을 어떻게 얻을 수 있을까요? 오늘 나는 내 자신의 관행 중 일부를 공유하겠습니다.

방법 1: 전역 변수 목록을 사용하여 반환 값 저장

ret_values = []

def thread_func(*args):
...
value = ...
ret_values.append(value)

목록을 선택하는 한 가지 이유는 목록의 추가() 메서드가 스레드로부터 안전하고 CPython에서 GIL이 다음에 대한 동시 액세스를 방지한다는 것입니다. 그들을. 사용자 정의 데이터 구조를 사용하는 경우 데이터가 동시에 수정되는 스레드 잠금을 추가해야 합니다.

미리 스레드 수를 알고 있는 경우 고정 길이 목록을 정의한 다음 인덱스에 따라 반환 값을 저장할 수 있습니다. 예:

from threading import Thread

threads = [None] * 10
results = [None] * 10

def foo(bar, result, index):
result[index] = f"foo-{index}"

for i in range(len(threads)):
threads[i] = Thread(target=foo, args=('world!', results, i))
threads[i].start()

for i in range(len(threads)):
threads[i].join()

print (" ".join(results))

방법 2: 스레드의 조인 방법을 다시 작성하고 반환 스레드 함수의 반환 값

Default thread.join() 메서드는 스레드 함수가 끝날 때까지 기다리며 반환 값이 없습니다. 여기에서 함수의 실행 결과를 반환할 수 있습니다.

from threading import Thread


def foo(arg):
return arg


class ThreadWithReturnValue(Thread):
def run(self):
if self._target is not None:
self._return = self._target(*self._args, **self._kwargs)

def join(self):
super().join()
return self._return


twrv = ThreadWithReturnValue(target=foo, args=("hello world",))
twrv.start()
print(twrv.join()) # 此处会打印 hello world。

이런 식으로 스레드가 끝날 때까지 기다리기 위해 thread.join()을 호출하면 스레드의 반환 값도 얻게 됩니다.

방법 3: 표준 라이브러리 Concurrent.futures를 사용하세요

처음 두 가지 방법은 너무 낮은 수준인 것 같아요. Python의 표준 라이브러리인 Concurrent.futures는 더 고급 스레드 작업을 제공하고 스레드의 반환 값을 직접 얻을 수 있습니다. 코드는 다음과 같습니다:

import concurrent.futures


def foo(bar):
return bar


with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
to_do = []
for i in range(10):# 模拟多个任务
future = executor.submit(foo, f"hello world! {i}")
to_do.append(future)

for future in concurrent.futures.as_completed(to_do):# 并发执行
print(future.result())

특정 작업의 결과는 다음과 같습니다:

hello world! 8
hello world! 3
hello world! 5
hello world! 2
hello world! 9
hello world! 7
hello world! 4
hello world! 0
hello world! 1
hello world! 6

위 내용은 Python에서 스레드 반환 값을 얻는 세 가지 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제