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

WBOY
풀어 주다: 2023-04-13 10:43:09
앞으로
2186명이 탐색했습니다.

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

방법 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으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿