最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析Python中線程以及線程阻塞

 更新時間:2023年04月23日 08:27:16   作者:真的不能告訴你我的名字  
這篇文章主要為大家簡單介紹一下Python中線程以及線程阻塞的相關知識,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下

本文所依賴的環(huán)境為:

進程和線程的概念

進程概念

我們想運行一個程序,首先會將該程序從存儲介質上通過IO總線加載進內存中,而后再通過cpu進行調度。這個時候,我么么將這個正在運行的程序稱之為進程,它有內存地址、內存空間、數(shù)據(jù)棧等等信息,進程之間通信一般稱之為IPC,常見的方法有 管道、消息隊列、套接字等。

線程概念

而線程則不同,線程是在進程中運行的,一個進程至少有一個線程。在單個cpu中,同一時刻一個進程只有一個線程在工作,其他則被掛起,也稱之為睡眠。由于線程屬于進程,所以會共享進程的內存信息。線程之間通信不僅可以使用共享內存來通信,依然可以使用 如 管道、消息隊列、套接字等。

線程優(yōu)缺點

多線程是一種并發(fā)方式,優(yōu)點為可以同時執(zhí)行多個任務,用于提升時間和效率。

比如,我們想寫一個python服務器下載電影,一次只能下載一部,若我們使用多線程后,可以一次"同時"下載n部,從而提升了效率。

但是有些事多線程不能做的,并發(fā)沖突是其中一種。比如掘金點贊功能,如果沒有對點贊這個變量進行并發(fā)控制,可能會出現(xiàn)數(shù)據(jù)不一致的情況。

在python中如何使用線程

在使用python寫多線程之前,先來看一個小案例,假設我們使用python寫了一個下載電影的程序。

import time

def downloadMovie(i):
    print("%s 開始下載編號為%s電影中。。。" % (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), str(i)))
    time.sleep(5)
    print("%s 編號為%s電影下載完畢" % (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), str(i)))

def main():
    for i in range(5):
        downloadMovie(i)

if __name__ == '__main__':
    main()

我們假設模擬下載電影的一個程序,下載過程使用time.sleep代替。在沒有使用多線程的時候,它的執(zhí)行過程如下:

可以看到,它是順序執(zhí)行的,需要等上一部下載完畢,才能開始下載下一部。

如果使用線程來做該需求呢? 我們可以這樣來寫:

import time
import threading

def downloadMovie(i):
    print("%s 開始下載編號為%s電影中。。。" % (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), str(i)))
    time.sleep(5)
    print("%s 編號為%s電影下載完畢" % (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), str(i)))

def main():
    for i in range(5):
        t = threading.Thread(target=downloadMovie,args=(i,))
        t.start()

if __name__ == '__main__':
    main()

上述代碼,在原始代碼基礎上,我們引入了threading庫,在循環(huán)中使用Thread來做線程的實例化對象,我們需要傳入targetargs,target需要傳入函數(shù)名稱,args需要傳入參數(shù),注意這里參數(shù)需要傳入可迭代的對象,所以當只有一個參數(shù)的時候,也需要在后面加一個,。最后使用start方法讓其開始執(zhí)行。

運行后的效果如下:

可以發(fā)現(xiàn),我們程序幾乎同步的打印下載開始,也幾乎同時打印下載完畢。

總結起來發(fā)現(xiàn),我們線程啟動一個線程,是不是非常簡單呢?只需要引入threading模塊,定義Thread來做對象,最后使用start()運行即可。

線程阻塞也很重要

線程直接跑就完了唄,為什么還需要阻塞呢?我們這里做一個簡單的需求:上面的代碼改改,我們下載完視頻后,要壓縮一下,由于只討論線程,所以就只用print代替操作,我們可以這樣操作:

在上面的基礎上,我們增加了2個步驟,1: 是將下載好的文件放入列表fileList中,2. 最后開始遍歷fileList文件,進行壓縮,最后打印一個壓縮完畢,看起來沒什么問題吧?

那我們來運行一下一下呢?

額。。。這個很顯然不符合我們的預期,我們還沒下載文件完畢,怎么就開始壓縮了呢,而且壓縮完畢了,再輸出的文件下載完畢,這是為什么呢?

這是因為線程在啟動后,如果我們不去設置阻塞,他就會一直執(zhí)行下去,就拿我們剛才的案例來看,我們可以將其理解為:

看上圖,我們啟動線程后,它就放在后臺了,我們就立馬執(zhí)行遍歷fileList步驟,但是這個時候恰恰fileList是空的,所以我們壓縮了空文件,壓縮完畢后,文件才下載完畢。

這個時候我們就需要等線程執(zhí)行完畢之后,再執(zhí)行下面的語句了,否則執(zhí)行完了沒意義,所以這個時候就需要引入線程阻塞了,我們需要將下載的線程全部執(zhí)行完畢后,再開始壓縮文件,只需要線程增加一個join方法即可,代碼修改如下:

在原先的基礎上,我們需要先定義一個線程池,用于放已經執(zhí)行了的線程,而后再遍歷該線程池,每一個都設置阻塞,這樣就會等所有線程都執(zhí)行完畢了,再進行后面的操作,由于我們后面是壓縮需要用到前面的結果,所以阻塞是必不可少的,程序執(zhí)行結果為:

這個流程圖可以理解為這樣的:

現(xiàn)在你知道阻塞有什么用了吧。

總結

今天介紹了一下python的多線程,這里只是簡單的使用threading庫,在python中,多線程的庫不僅于此,還有thread、Queue等。最后舉了一個很簡單的例子來說明線程阻塞的重要性。

以上就是淺析Python中線程以及線程阻塞的詳細內容,更多關于Python線程的資料請關注腳本之家其它相關文章!

相關文章

  • 利用Python實現(xiàn)一鍵將頭像轉成動漫風

    利用Python實現(xiàn)一鍵將頭像轉成動漫風

    小編今天將為大家詳細介紹如何利用Python語言制作一個UI界面,大家可以通過一鍵點擊就實現(xiàn)頭像照片轉化成動漫風格的功能,感興趣的可以動手嘗試一下
    2022-07-07
  • pytorch 實現(xiàn)變分自動編碼器的操作

    pytorch 實現(xiàn)變分自動編碼器的操作

    這篇文章主要介紹了pytorch 實現(xiàn)變分自動編碼器的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python+opencv實現(xiàn)論文插圖局部放大并拼接效果

    python+opencv實現(xiàn)論文插圖局部放大并拼接效果

    在做圖像數(shù)據(jù)標注時,很難一次就做到精準標注,如果目標比較小,即使微調也難以做到精準,所以就需要另外一個窗口對標注區(qū)域進行局部放大以方便微調,這篇文章主要給大家介紹了關于python+opencv實現(xiàn)論文插圖局部放大并拼接效果的相關資料,需要的朋友可以參考下
    2021-10-10
  • Python腳本實現(xiàn)音頻和視頻格式轉換

    Python腳本實現(xiàn)音頻和視頻格式轉換

    這篇文章主要為大家詳細介紹了Python如何通過腳本實現(xiàn)音頻和視頻格式轉換,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-03-03
  • python 如何查看pytorch版本

    python 如何查看pytorch版本

    這篇文章主要介紹了python 查看pytorch版本的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Flask教程之重定向與錯誤處理實例分析

    Flask教程之重定向與錯誤處理實例分析

    這篇文章主要介紹了Flask教程之重定向與錯誤處理,結合實例形式分析了flask框架重定向、狀態(tài)碼判斷及錯誤處理相關操作技巧,需要的朋友可以參考下
    2019-08-08
  • Python連接Hadoop數(shù)據(jù)中遇到的各種坑(匯總)

    Python連接Hadoop數(shù)據(jù)中遇到的各種坑(匯總)

    這篇文章主要介紹了Python連接Hadoop數(shù)據(jù)中遇到的各種坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • python實現(xiàn)批量按比例縮放圖片效果

    python實現(xiàn)批量按比例縮放圖片效果

    這篇文章主要為大家詳細介紹了python實現(xiàn)批量按比例縮放圖片效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • python如何將圖片生成視頻MP4

    python如何將圖片生成視頻MP4

    這篇文章主要介紹了python如何將圖片生成視頻MP4問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • tensorflow可視化Keras框架中Tensorboard使用示例

    tensorflow可視化Keras框架中Tensorboard使用示例

    這篇文章主要為大家介紹了tensorflow可視化Keras框架中Tensorboard使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05

最新評論

秀山| 芮城县| 鄱阳县| 兴义市| 邵武市| 和田市| 大余县| 华池县| 乌拉特前旗| 汉川市| 年辖:市辖区| 开远市| 临西县| 句容市| 佛山市| 宝鸡市| 延吉市| 光泽县| 峡江县| 南昌县| 南阳市| 十堰市| 崇义县| 鄱阳县| 云霄县| 万全县| 玉树县| 德保县| 勃利县| 中卫市| 金溪县| 哈巴河县| 德钦县| 永春县| 禄丰县| 宁都县| 得荣县| 海盐县| 遂溪县| 斗六市| 沾化县|