ホームページ  >  記事  >  バックエンド開発  >  Python でスレッドの戻り値を取得する 3 つの方法

Python でスレッドの戻り値を取得する 3 つの方法

WBOY
WBOY転載
2023-04-13 10:43:092109ブラウズ

スレッドに関して言えば、あなたの脳は次のような印象を持つはずです: いつ開始するかは制御できますが、いつ終了するかは制御できません。では、スレッドの戻り値を取得するにはどうすればよいでしょうか?今日は私自身の実践例をいくつか共有したいと思います。

方法 1: グローバル変数のリストを使用して戻り値を保存する

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))

方法 2: Thread の join メソッドを書き換えてスレッド関数の戻り値を返す

デフォルトの 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 を使用する

最初の 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 サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。