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

Tiga cara untuk mendapatkan nilai pulangan benang dalam Python

WBOY
Lepaskan: 2023-04-13 10:43:09
ke hadapan
2317 orang telah melayarinya

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)
Salin selepas log masuk

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))
Salin selepas log masuk

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。
Salin selepas log masuk

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())
Salin selepas log masuk

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
Salin selepas log masuk

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!

Label berkaitan:
sumber:51cto.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan