小編寫這篇文字的一個主要目的,主要是給大家解答關(guān)于python的一些相關(guān)事宜,主要涉及到內(nèi)容是如何利用其python獲取返回值,那么,返回值的三種方式分別是什么呢?具體的內(nèi)容,下面就給大家詳細(xì)的做出解答。
提到線程,你的大腦應(yīng)該有這樣的印象:我們可以控制它何時(shí)開始,卻無法控制它何時(shí)結(jié)束,那么如何獲取線程的返回值呢?今天就分享一下自己的一些做法。
方法一
使用全局變量的列表,來保存返回值
ret_values=[] def thread_func(*args): ... value=... ret_values.append(value)
選擇列表的一個原因是:列表的append()方法是線程安全的,CPython中,GIL防止對它們的并發(fā)訪問。如果你使用自定義的數(shù)據(jù)結(jié)構(gòu),在并發(fā)修改數(shù)據(jù)的地方需要加線程鎖。
如果事先知道有多少個線程,可以定義一個固定長度的列表,然后根據(jù)索引來存放返回值,比如:
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方法,返回線程函數(shù)的返回值
默認(rèn)的thread.join()方法只是等待線程函數(shù)結(jié)束,沒有返回值,我們可以在此處返回函數(shù)的運(yùn)行結(jié)果,代碼如下:
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。
這樣當(dāng)我們調(diào)用thread.join()等待線程結(jié)束的時(shí)候,也就得到了線程的返回值。
方法三
使用標(biāo)準(zhǔn)庫concurrent.futures
我覺得前兩種方式實(shí)在太低級了,Python的標(biāo)準(zhǔn)庫concurrent.futures提供更高級的線程操作,可以直接獲取線程的返回值,相當(dāng)優(yōu)雅,代碼如下:
import concurrent.futures def foo(bar): return bar with concurrent.futures.ThreadPoolExecutor(max_workers=10)as executor: to_do=[] for i in range(10):#模擬多個任務(wù) future=executor.submit(foo,f"hello world!{i}") to_do.append(future) for future in concurrent.futures.as_completed(to_do):#并發(fā)執(zhí)行 print(future.result())
某次運(yùn)行的結(jié)果如下:
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
最后的話
本文分享了獲取線程返回值的3種方法,推薦使用第三種
綜上所述,這篇文章就給大家介紹到這里了,希望可以給大家?guī)砀鄮椭?/p>
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/128309.html
Python的三種主要模塊介紹 小編寫這篇文章的主要目的,給大家介紹三種主要的模塊,包括系統(tǒng)內(nèi)的幾種模塊,對其做個具體的介紹,下面就給大家詳細(xì)的解答下。 在python中,一個文件(以.py為后綴名的文件)就叫做一個模塊,每一個模塊在python里都被看做是一個獨(dú)立的文件。 模塊可以被項(xiàng)目中的其他模塊、一些腳本甚至是交互式的解析器所使用,它可以被其他程序引用,從而使用該模塊里的函數(shù)等功能...
小編寫這篇文章的一個主要目的,主要就是給大家去做一個解答,接的內(nèi)容主要是利用python去讀取excel表格,那么,怎么才能快速的實(shí)現(xiàn)這個操作呢?下面就給大家詳細(xì)解答下。 一、python讀取excel表格數(shù)據(jù) 1、讀取excel表格數(shù)據(jù)常用操作 importxlrd #打開excel表格 data_excel=xlrd.open_workbook('data/datas...
字典作為python中一個內(nèi)置的數(shù)據(jù)機(jī)構(gòu),它其實(shí)和列表是一樣的,但是它又是沒有順序的,以鍵值的方式,用來存儲數(shù)據(jù),那么,它的使用教程是什么呢?下文給大家做個解答。 一.什么是字典 字典作為Python的一個內(nèi)置數(shù)據(jù)結(jié)構(gòu),和列表一樣都是可變序列的,但是它是無序的,以鍵值對的方式存儲數(shù)據(jù)。 二.創(chuàng)建字典 創(chuàng)建字典的兩種方式,一種使用{}另一種使用內(nèi)置函數(shù)dict() #author:爪哇斗...
小編寫這篇文章的主要目的,就是給大家介紹關(guān)于Python標(biāo)準(zhǔn)庫sys常用功能的一些介紹,這樣對我們以后的工作也是很有幫助的,具體的介紹,下面就給大家詳細(xì)解答下。 1、查看版本信息 #coding:utf-8 importsys #獲取Python版本信息 print(sys.version) #獲取解釋器中C的API版本 print(sys.api_version) ...
閱讀 911·2023-01-14 11:38
閱讀 878·2023-01-14 11:04
閱讀 740·2023-01-14 10:48
閱讀 1983·2023-01-14 10:34
閱讀 942·2023-01-14 10:24
閱讀 819·2023-01-14 10:18
閱讀 499·2023-01-14 10:09
閱讀 572·2023-01-14 10:02