スレッドに関して言えば、あなたの脳は次のような印象を持つはずです: いつ開始するかは制御できますが、いつ終了するかは制御できません。では、スレッドの戻り値を取得するにはどうすればよいでしょうか?今日は私自身の実践例をいくつか共有したいと思います。
ret_values = [] def thread_func(*args): ... value = ... ret_values.append(value)
リストを選択する理由の 1 つは、リストの append() メソッドがスレッド セーフであることです。 、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))
デフォルトの 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() を呼び出してスレッドが終了するのを待つと、スレッドの戻り値を取得します。
最初の 2 つの方法は低レベルすぎると思います。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 でスレッドの戻り値を取得する 3 つの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。