Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Tiga cara untuk mendapatkan nilai pulangan benang dalam Python

Tiga cara untuk mendapatkan nilai pulangan benang dalam Python

WBOY
WBOYke hadapan
2023-04-13 10:43:092109semak imbas

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.

Kaedah 1: Gunakan senarai pembolehubah global untuk menyimpan nilai pulangan

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 2: Tulis semula kaedah sambung Thread , kembalikan nilai pulangan fungsi thread

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.

Kaedah 3: Gunakan concurrent.futures pustaka standard

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!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Kaedah ajaib dalam PythonArtikel seterusnya:Kaedah ajaib dalam Python