詳解Python并發(fā)編程之創(chuàng)建多線(xiàn)程的幾種方法
大家好,并發(fā)編程 今天開(kāi)始進(jìn)入第二篇。
今天的內(nèi)容會(huì)比較基礎(chǔ),主要是為了讓新手也能無(wú)障礙地閱讀,所以還是要再鞏固下基礎(chǔ)。學(xué)完了基礎(chǔ),你們也就能很順暢地跟著我的思路理解以后的文章。
本文目錄
- 學(xué)會(huì)使用函數(shù)創(chuàng)建多線(xiàn)程
- 學(xué)會(huì)使用類(lèi)創(chuàng)建多線(xiàn)程
- 多線(xiàn)程:必學(xué)函數(shù)講解
經(jīng)過(guò)總結(jié),Python創(chuàng)建多線(xiàn)程主要有如下兩種方法:
- 函數(shù)
- 類(lèi)
接下來(lái),我們就來(lái)揭開(kāi)多線(xiàn)程的神秘面紗。
. 學(xué)會(huì)使用函數(shù)創(chuàng)建多線(xiàn)程
在Python3中,Python提供了一個(gè)內(nèi)置模塊 threading.Thread,可以很方便地讓我們創(chuàng)建多線(xiàn)程。
threading.Thread() 一般接收兩個(gè)參數(shù):
- 線(xiàn)程函數(shù)名:要放置線(xiàn)程讓其后臺(tái)執(zhí)行的函數(shù),由我們自已定義,注意不要加();
- 線(xiàn)程函數(shù)的參數(shù):線(xiàn)程函數(shù)名所需的參數(shù),以元組的形式傳入。若不需要參數(shù),可以不指定。
舉個(gè)例子
import time
from threading import Thread
# 自定義線(xiàn)程函數(shù)。
def main(name="Python"):
for i in range(2):
print("hello", name)
time.sleep(1)
# 創(chuàng)建線(xiàn)程01,不指定參數(shù)
thread_01 = Thread(target=main)
# 啟動(dòng)線(xiàn)程01
thread_01.start()
# 創(chuàng)建線(xiàn)程02,指定參數(shù),注意逗號(hào)
thread_02 = Thread(target=main, args=("MING",))
# 啟動(dòng)線(xiàn)程02
thread_02.start()
可以看到輸出
hello Python
hello MING
hello Python
hello MING
是不是超級(jí)簡(jiǎn)單呢?別急,下面也是一樣簡(jiǎn)單。
. 學(xué)會(huì)使用類(lèi)創(chuàng)建多線(xiàn)程
相比較函數(shù)而言,使用類(lèi)創(chuàng)建線(xiàn)程,會(huì)比較麻煩一點(diǎn)。
首先,我們要自定義一個(gè)類(lèi),對(duì)于這個(gè)類(lèi)有兩點(diǎn)要求,
- 必須繼承 threading.Thread 這個(gè)父類(lèi);
- 必須覆寫(xiě) run 方法。
這里的 run 方法,和我們上面線(xiàn)程函數(shù)的性質(zhì)是一樣的,可以寫(xiě)我們的業(yè)務(wù)邏輯程序。在 start() 后將會(huì)調(diào)用。
來(lái)看一下例子
為了方便對(duì)比,run函數(shù)我復(fù)用上面的main。
import time
from threading import Thread
class MyThread(Thread):
def __init__(self, name="Python"):
# 注意,super().__init__() 一定要寫(xiě)
# 而且要寫(xiě)在最前面,否則會(huì)報(bào)錯(cuò)。
super().__init__()
self.name=name
def run(self):
for i in range(2):
print("hello", self.name)
time.sleep(1)
if __name__ == '__main__':
# 創(chuàng)建線(xiàn)程01,不指定參數(shù)
thread_01 = MyThread()
# 創(chuàng)建線(xiàn)程02,指定參數(shù)
thread_02 = MyThread("MING")
thread_01.start()
thread_02.start()
當(dāng)然結(jié)果也是一樣的。
hello Python
hello MING
hello Python
hello MING
. 多線(xiàn)程:必學(xué)函數(shù)講解
學(xué)完了兩種創(chuàng)建線(xiàn)程的方式,你一定會(huì)驚嘆,咋么這么簡(jiǎn)單,一點(diǎn)難度都沒(méi)有。
其實(shí)不然,上面我們的線(xiàn)程函數(shù) 為了方便理解,都使用的最簡(jiǎn)單的代碼邏輯。而在實(shí)際使用當(dāng)中,多線(xiàn)程運(yùn)行期間,還會(huì)出現(xiàn)諸多問(wèn)題,只是我們現(xiàn)在還沒(méi)體會(huì)到它的復(fù)雜而已。
不過(guò),你也不必?fù)?dān)心,在后面的章節(jié)中,我會(huì)帶著大家一起來(lái)探討一下,都有哪些難題,應(yīng)該如何解決。
磨刀不誤吹柴工,我們首先得來(lái)認(rèn)識(shí)一下,Python給我們提供的 Thread 都有哪些函數(shù)和屬性,實(shí)現(xiàn)哪些功能。學(xué)習(xí)完這些,在后期的學(xué)習(xí)中,我們才能更加得以應(yīng)手。
經(jīng)過(guò)我的總結(jié),大約常用的方法有如下這些:
t=Thread(target=func) # 啟動(dòng)子線(xiàn)程 t.start() # 阻塞子線(xiàn)程,待子線(xiàn)程結(jié)束后,再往下執(zhí)行 t.join() # 判斷線(xiàn)程是否在執(zhí)行狀態(tài),在執(zhí)行返回True,否則返回False t.is_alive() t.isAlive() # 設(shè)置線(xiàn)程是否隨主線(xiàn)程退出而退出,默認(rèn)為False t.daemon = True t.daemon = False # 設(shè)置線(xiàn)程名 t.name = "My-Thread"
好了,Python線(xiàn)程基礎(chǔ)知識(shí),我們大概都介紹完了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
零基礎(chǔ)寫(xiě)python爬蟲(chóng)之打包生成exe文件
本文介紹了通過(guò)pyinstaller和pywin32兩個(gè)插件在windows環(huán)境下,將py文件打包成exe文件,有需要的朋友可以參考下2014-11-11
pytorch實(shí)現(xiàn)梯度下降和反向傳播圖文詳細(xì)講解
這篇文章主要介紹了pytorch實(shí)現(xiàn)梯度下降和反向傳播,反向傳播的目的是計(jì)算成本函數(shù)C對(duì)網(wǎng)絡(luò)中任意w或b的偏導(dǎo)數(shù)。一旦我們有了這些偏導(dǎo)數(shù),我們將通過(guò)一些常數(shù)α的乘積和該數(shù)量相對(duì)于成本函數(shù)的偏導(dǎo)數(shù)來(lái)更新網(wǎng)絡(luò)中的權(quán)重和偏差2023-04-04
Python實(shí)現(xiàn)截圖生成符合markdown的鏈接
之前是用的是typora來(lái)寫(xiě)的文章,最近typora最近開(kāi)始收費(fèi)了,所以就不想用了,于是找到了一個(gè)替代品MarkText。本文將介紹如何通過(guò)Python實(shí)現(xiàn)截圖自動(dòng)生成符合markdown的鏈接,感興趣的可以了解一下2022-01-01
python實(shí)現(xiàn)從ftp上下載文件的實(shí)例方法
在本篇文章里小編給大家整理了關(guān)于python實(shí)現(xiàn)從ftp上下載文件的實(shí)例方法,需要的朋友們可以參考下。2020-07-07
Django 外鍵查詢(xún)的實(shí)現(xiàn)
今天學(xué)習(xí)了一下外鍵查詢(xún)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06

