Apabila bercakap tentang benang, otak anda sepatutnya mempunyai tanggapan ini: kita boleh mengawal bila ia bermula, tetapi kita tidak boleh mengawal apabila ia tamat Jadi bagaimana kita mendapatkan nilai pulangan benang? Hari ini saya akan berkongsi beberapa amalan saya sendiri.
ret_values = [] def thread_func(*args): ... value = ... ret_values.append(value)
Satu sebab untuk memilih senarai ialah: kaedah append() senarai adalah selamat untuk benang, dalam CPython, GIL Cegah akses serentak kepada mereka. Jika anda menggunakan struktur data tersuai, anda perlu menambah kunci benang yang data diubah suai secara serentak.
Jika anda tahu terlebih dahulu berapa banyak utas yang ada, anda boleh menentukan senarai panjang tetap, dan kemudian menyimpan nilai pulangan mengikut indeks, contohnya:
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))
Kaedah thread.join() lalai hanya menunggu fungsi thread untuk tamat, tanpa nilai pulangan Kita boleh mengembalikan larian hasil daripada fungsi di sini, kodnya adalah seperti berikut:
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。
Dengan cara ini, apabila kita memanggil thread.join() dan menunggu sehingga thread tamat, kita juga akan mendapat nilai pulangan bagi benang.
Saya rasa dua kaedah pertama adalah concurrent.futures pustaka standard Python peringkat rendah menyediakan operasi benang yang lebih maju dan boleh mendapatkan utas secara langsung . Nilai pulangan agak elegan Kodnya adalah seperti berikut:
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())
Hasil operasi tertentu adalah seperti berikut:
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
Atas ialah kandungan terperinci Tiga cara untuk mendapatkan nilai pulangan benang dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!