스레드에 관해서는 우리의 뇌가 다음과 같은 인상을 받아야 합니다. 스레드가 시작되는 시점은 제어할 수 있지만 종료되는 시점은 제어할 수 없습니다. 그렇다면 스레드의 반환 값을 어떻게 얻을 수 있을까요? 오늘 나는 내 자신의 관행 중 일부를 공유하겠습니다.
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))
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()을 호출하면 스레드의 반환 값도 얻게 됩니다.
처음 두 가지 방법은 너무 낮은 수준인 것 같아요. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!