Python實(shí)現(xiàn)從線程獲取返回值
這篇文章首先討論了線程的基礎(chǔ)知識(shí),并提供了一個(gè)在Python中啟動(dòng)線程的代碼示例。然后,我們將討論一個(gè)在線程中獲取函數(shù)返回值的代碼。
線程是進(jìn)程內(nèi)的輕量級(jí)執(zhí)行單元,具有自己的程序執(zhí)行狀態(tài)。一個(gè)進(jìn)程可以運(yùn)行多個(gè)線程以實(shí)現(xiàn)并發(fā)(有時(shí)也是并行)。
進(jìn)程和線程的主要區(qū)別在于每個(gè)進(jìn)程都有一個(gè)獨(dú)立的不相交地址空間,而同一進(jìn)程的多個(gè)線程共享單個(gè)進(jìn)程的地址空間。
這意味著線程可以使用共享內(nèi)存進(jìn)行通信,而無(wú)需額外的管道(普通管道或FIFO)或任何消息傳遞接口。
在Python中使用多線程的HelloWorld程序
考慮以下代碼:
from threading import Thread # 一個(gè)線程的函數(shù) def first_function(): print('Hello World') print("main program start") thread_1 = Thread(target=first_function) thread_2 = Thread(target=first_function) thread_1.start() thread_2.start() print("main ends")
在上面的代碼中,首先我們使用 from threading import Thread
語(yǔ)句導(dǎo)入 Thread 類以使用多線程功能。我們定義了一個(gè)名為 first_function()
的函數(shù),用于顯示 “Hello World”,并使用 Thread()
類實(shí)例化了兩個(gè)線程對(duì)象。
我們通過(guò)將 first_function()
作為目標(biāo)函數(shù)傳遞給 Thread()
來(lái)創(chuàng)建了兩個(gè) Thread()
類的實(shí)例。target 屬性指定要由 Thread()
執(zhí)行的函數(shù)。
一旦創(chuàng)建了 Thread()
實(shí)例,我們可以使用 .start()
方法運(yùn)行和執(zhí)行這些線程。
在線程中傳遞參數(shù)給函數(shù)
考慮以下代碼:
from threading import Thread def first_function(name, id): print('Hello World from', name, "ID=", id) thread_1 = Thread(target=first_function, args=("Thread 1", 1)) thread_2 = Thread(target=first_function, args=("Thread 2", 2)) thread_1.start() thread_2.start()
在上面的代碼中,我們定義了一個(gè)名為 first_function(name, id)
的函數(shù),它接收兩個(gè)參數(shù) name 和 id。我們使用 args 在 Thread 類中將這些參數(shù)作為元組傳遞。
我們創(chuàng)建了兩個(gè) Thread 類對(duì)象,并分別將參數(shù) args=("Thread 1", 1)
和 args=("Thread 2", 2)
傳遞給 thread_1 和 thread_2。然后,我們使用 thread_1.start()
和 thread_2.start()
來(lái)運(yùn)行這些線程。
在Python中從運(yùn)行在線程中的函數(shù)中獲取返回值
有多種方法可以從在線程中運(yùn)行的函數(shù)中獲取返回值。
傳遞一個(gè)可變對(duì)象給函數(shù)
我們可以通過(guò)將一個(gè)可變對(duì)象傳遞給在線程中運(yùn)行的函數(shù)來(lái)獲取函數(shù)的返回值;函數(shù)將返回值放在該對(duì)象中。
考慮以下代碼:
from threading import Thread def first_function(first_argu, return_val): print(first_argu) return_val[0] = "Return Value from " + first_argu return_val_from_1 = [None] * 1 return_val_from_2 = [None] * 1 thread_1 = Thread(target=first_function, args=("Thread 1", return_val_from_1)) thread_2 = Thread(target=first_function, args=("Thread 2", return_val_from_2)) thread_1.start() thread_2.start() thread_1.join() thread_2.join() print(return_val_from_1) print(return_val_from_2)
上面的代碼定義了一個(gè)名為 first_function 的函數(shù),它接收兩個(gè)參數(shù) first_argu 和 return_val。first_function 顯示 first_argu 的值,并將返回值放在 return_val 的索引 0 處。
我們使用 Thread 類創(chuàng)建線程,并傳遞兩個(gè)參數(shù),包括一個(gè)列表 args=("Thread 1", return_val_from_1)
和 args=("Thread 2", return_val_from_2)
分別給 thread_1 和 thread_2。
return_val_from_1 和 return_val_from_2 用于獲取函數(shù)的返回值。
thread_1.join()
和 thread_2.join()
用于等待主程序完成這兩個(gè)線程。
讓我們看一下上述代碼片段的輸出:
使用 join 方法
join 方法是另一種從在線程中獲取返回值的方法。
考慮以下代碼:
from threading import Thread def first_function(first_argu): print(first_argu) return "Return Value from " + first_argu class NewThread(Thread): def __init__(self, group=None, target=None, name=None, args=(), kwargs={}): Thread.__init__(self, group, target, name, args, kwargs) def run(self): if self._target != None: self._return = self._target(*self._args, **self._kwargs) def join(self, *args): Thread.join(self, *args) return self._return thread_1 = NewThread(target=first_function, args=("Thread 1",)) thread_2 = NewThread(target=first_function, args=("Thread 2",)) thread_1.start() thread_2.start() print(thread_1.join()) print(thread_2.join())
在上面的代碼中,我們定義了一個(gè)名為 NewThread 的自定義類,它是 Thread 類的子類。我們重新定義了 run 和 join 方法。
一旦我們創(chuàng)建并啟動(dòng)了一個(gè)線程,join()
方法將返回從 first_function 返回的值。
以下是上述代碼的輸出:
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
django注冊(cè)用郵箱發(fā)送驗(yàn)證碼的實(shí)現(xiàn)
這篇文章主要介紹了django注冊(cè)用郵箱發(fā)送驗(yàn)證碼的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04基于python純函數(shù)實(shí)現(xiàn)井字棋游戲
這篇文章主要介紹了基于python純函數(shù)實(shí)現(xiàn)井字棋游戲,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05python從sqlite讀取并顯示數(shù)據(jù)的方法
這篇文章主要介紹了python從sqlite讀取并顯示數(shù)據(jù)的方法,涉及Python操作SQLite數(shù)據(jù)庫(kù)的讀取及顯示相關(guān)技巧,需要的朋友可以參考下2015-05-05基于Python編寫簡(jiǎn)易文字語(yǔ)音轉(zhuǎn)換器
這篇文章主要為大家介紹了如何利用Python編寫一個(gè)簡(jiǎn)易文字語(yǔ)音轉(zhuǎn)換器,并打包成exe。文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起嘗試一下2022-03-03Python數(shù)據(jù)分析之matplotlib繪圖詳解
這篇文章主要為大家詳細(xì)介紹了Python數(shù)據(jù)分析之如何利用matplotlib進(jìn)行繪圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-09-09Python中使用 Selenium 實(shí)現(xiàn)網(wǎng)頁(yè)截圖實(shí)例
這篇文章主要介紹了Python中使用 Selenium 實(shí)現(xiàn)網(wǎng)頁(yè)截圖實(shí)例,Selenium支持Java、C#、Ruby 以及 Python等語(yǔ)言,本文以Python語(yǔ)言為例,需要的朋友可以參考下2014-07-07利用python獲取當(dāng)前日期前后N天或N月日期的方法示例
最近在工作中遇到一個(gè)需求,查找資料發(fā)現(xiàn)了一個(gè)很好的時(shí)間組件,所以下面這篇文章主要給大家介紹了關(guān)于利用python獲取當(dāng)前日期前后N天或N月日期的方法示例,需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2017-07-07python3實(shí)現(xiàn)指定目錄下文件sha256及文件大小統(tǒng)計(jì)
這篇文章主要為大家詳細(xì)介紹了python3實(shí)現(xiàn)指定目錄下文件sha256及文件大小統(tǒng)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02