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

Python中的多線程實(shí)例(簡(jiǎn)單易懂)

 更新時(shí)間:2022年06月20日 16:16:05   作者:時(shí)代&信念  
這篇文章主要介紹了Python中的多線程實(shí)例,一個(gè)CPU,將時(shí)間切成一片一片的,CPU輪轉(zhuǎn)著去處理一件一件的事情,到了規(guī)定的時(shí)間片就處理下一件事情,更多的相關(guān)內(nèi)容需要的小伙伴可以參考下面文章詳細(xì)

前言:

多線程簡(jiǎn)單理解就是:一個(gè)CPU,也就是單核,將時(shí)間切成一片一片的,CPU輪轉(zhuǎn)著去處理一件一件的事情,到了規(guī)定的時(shí)間片就處理下一件事情。

1.python中顯示當(dāng)前線程信息的屬性和方法

# coding:utf-8
# 導(dǎo)入threading包
import threading
if __name__ == "__main__":
    print("當(dāng)前活躍線程的數(shù)量", threading.active_count())
    print("將當(dāng)前所有線程的具體信息展示出來(lái)", threading.enumerate())
    print("當(dāng)前的線程的信息展示", threading.current_thread())

效果圖:

在這里插入圖片描述

2.添加一個(gè)線程

# coding:utf-8
import threading
import time
def job1():
    # 讓這個(gè)線程多執(zhí)行幾秒
    time.sleep(5)
    print("the number of T1 is %s" % threading.current_thread())
if __name__ == "__main__":
    # 創(chuàng)建一個(gè)新的線程
    new_thread = threading.Thread(target=job1, name="T1")
    # 啟動(dòng)新線程
    new_thread.start()
    print("當(dāng)前線程數(shù)量為", threading.active_count())
    print("所有線程的具體信息", threading.enumerate())
    print("當(dāng)前線程具體信息", threading.current_thread())

效果圖:

在這里插入圖片描述

3.線程中的join函數(shù)

(1)預(yù)想的是,執(zhí)行完線程1,然后輸出All done…“理想很豐滿,現(xiàn)實(shí)卻不是這樣的”

# coding:utf-8
import threading
import time
def job1():
    print("T1 start")
    for i in range(5):
        time.sleep(1)
        print(i)
    print("T1 finish")
def main():
    # 新創(chuàng)建一個(gè)線程
    new_thread = threading.Thread(target=job1, name="T1")
    # 啟動(dòng)新線程
    new_thread.start()
    print("All done...")
if __name__ == "__main__":
    main()

效果圖:

在這里插入圖片描述

(2)為了達(dá)到我們的預(yù)期,我們使用join函數(shù),將T1線程進(jìn)行阻塞。join函數(shù)進(jìn)行阻塞是什么意思?就是哪個(gè)線程使用了join函數(shù),當(dāng)這個(gè)線程正在執(zhí)行時(shí),在他之后的線程程序不能執(zhí)行,得等這個(gè)被阻塞的線程全部執(zhí)行完畢之后,方可執(zhí)行!

# coding:utf-8
import threading
import time
def job1():
    print("T1 start")
    for i in range(5):
        time.sleep(1)
        print(i)
    print("T1 finish")
def main():
    # 新創(chuàng)建一個(gè)線程
    new_thread = threading.Thread(target=job1, name="T1")
    # 啟動(dòng)新線程
    new_thread.start()
    # 阻塞這個(gè)T1線程
    new_thread.join()
    print("All done...")
if __name__ == "__main__":
    main()

效果圖:

在這里插入圖片描述

4.使用Queue存儲(chǔ)線程的結(jié)果

線程的執(zhí)行結(jié)果,無(wú)法通過(guò)return進(jìn)行返回,使用Queue存儲(chǔ)。

# coding:utf-8
import threading
from queue import Queue
"""
    Queue的使用
"""
def job(l, q):
    for i in range(len(l)):
        l[i] = l[i] ** 2
    q.put(l)
def multithreading():
    # 創(chuàng)建隊(duì)列
    q = Queue()
    # 線程列表
    threads = []
    # 二維列表
    data = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [6, 6, 6]]
    for i in range(4):
        t = threading.Thread(target=job, args=(data[i], q))
        t.start()
        threads.append(t)

    # 對(duì)所有線程進(jìn)行阻塞
    for thread in threads:
        thread.join()
    results = []
    # 將新隊(duì)列中的每個(gè)元素挨個(gè)放到結(jié)果列表中
    for _ in range(4):
        results.append(q.get())
    print(results)
if __name__ == "__main__":
    multithreading()

效果圖:

在這里插入圖片描述

5.線程鎖lock

當(dāng)同時(shí)啟動(dòng)多個(gè)線程時(shí),各個(gè)線程之間會(huì)互相搶占計(jì)算資源,會(huì)造成程序混亂。

舉個(gè)栗子:

當(dāng)我們?cè)谶x課系統(tǒng)選課時(shí),當(dāng)前籃球課還有2個(gè)名額,我們?nèi)齻€(gè)人去選課。

選課順序?yàn)閟tu1 stu2 stu3,應(yīng)該依次打印他們?nèi)齻€(gè)的選課過(guò)程,但是現(xiàn)實(shí)情況卻是:

# coding:utf-8
import threading
import time

def stu1():
    print("stu1開(kāi)始選課")
    global course
    if course > 0:
        course -= 1
        time.sleep(2)
        print("stu1選課成功,現(xiàn)在籃球課所剩名額為%d" % course)
    else:
        time.sleep(2)
        print("stu1選課失敗,籃球課名額為0,請(qǐng)選擇其他課程")
def stu2():
    print("stu2開(kāi)始選課")
    global course
    if course > 0:
        course -= 1
        time.sleep(2)
        print("stu2選課成功,現(xiàn)在籃球課所剩名額為%d" % course)
    else:
        time.sleep(2)
        print("stu2選課失敗,籃球課名額為0,請(qǐng)選擇其他課程")

def stu3():
    print("stu3開(kāi)始選課")
    global course
    if course > 0:
        course -= 1
        time.sleep(2)
        print("stu3選課成功")
        print("籃球課所剩名額為%d" %course)
    else:
        time.sleep(2)
        print("stu3選課失敗,籃球課名額為0,請(qǐng)選擇其他課程")
if __name__ == "__main__":
    # 籃球課名額
    course = 2
    T1 = threading.Thread(target=stu1, name="T1")
    T2 = threading.Thread(target=stu2, name="T2")
    T3 = threading.Thread(target=stu3, name="T3")
    T1.start()
    T2.start()
    T3.start()

效果圖:

在這里插入圖片描述

為了解決這種情況,我們使用lock線程同步鎖,在線程并發(fā)執(zhí)行時(shí),保證每個(gè)線程執(zhí)行的原子性。有效防止了共享統(tǒng)一數(shù)據(jù)時(shí),線程并發(fā)執(zhí)行的混亂。

改進(jìn)的代碼如下:

# coding:utf-8
import threading
import time
def stu1():
    global lock
    lock.acquire()
    print("stu1開(kāi)始選課")
    global course
    if course > 0:
        course -= 1
        time.sleep(2)
        print("stu1選課成功,現(xiàn)在籃球課所剩名額為%d" % course)
    else:
        time.sleep(2)
        print("stu1選課失敗,籃球課名額為0,請(qǐng)選擇其他課程")
    lock.release()


def stu2():
    global lock
    lock.acquire()
    print("stu2開(kāi)始選課")
    global course
    if course > 0:
        course -= 1
        print("stu2選課成功,現(xiàn)在籃球課所剩名額為%d" % course)
    else:
        time.sleep(1)
        print("stu2選課失敗,籃球課名額為0,請(qǐng)選擇其他課程")
    lock.release()

def stu3():
    global lock
    lock.acquire()
    print("stu3開(kāi)始選課")
    global course
    if course > 0:
        course -= 1
        time.sleep(1)
        print("stu3選課成功,現(xiàn)在籃球課所剩名額為%d" % course)
    else:
        time.sleep(1)
        print("stu3選課失敗,籃球課名額為0,請(qǐng)選擇其他課程")
    lock.release()

if __name__ == "__main__":
    # 籃球課名額
    course = 2
    # 創(chuàng)建同步鎖
    lock = threading.Lock()
    T1 = threading.Thread(target=stu1, name="T1")
    T2 = threading.Thread(target=stu2, name="T2")
    T3 = threading.Thread(target=stu3, name="T3")
    T1.start()
    T2.start()
    T3.start()

效果圖:

在這里插入圖片描述

到此這篇關(guān)于Python中的多線程實(shí)例(簡(jiǎn)單易懂)的文章就介紹到這了,更多相關(guān)Python多線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python制作旋轉(zhuǎn)花燈祝大家元宵節(jié)快樂(lè)(實(shí)例代碼)

    Python制作旋轉(zhuǎn)花燈祝大家元宵節(jié)快樂(lè)(實(shí)例代碼)

    一年一度的元宵節(jié)來(lái)臨,小編在這里祝大家2022元宵節(jié)快樂(lè),今天小編給大家分享一篇教程關(guān)于Python制作旋轉(zhuǎn)花燈祝大家元宵節(jié)快樂(lè),代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-02-02
  • Python中的map、reduce和filter淺析

    Python中的map、reduce和filter淺析

    這篇文章主要介紹了Python中的map、reduce和filter,用實(shí)例來(lái)理解這3個(gè)函數(shù),需要的朋友可以參考下
    2014-04-04
  • 簡(jiǎn)單介紹Python2.x版本中的cmp()方法的使用

    簡(jiǎn)單介紹Python2.x版本中的cmp()方法的使用

    這篇文章主要介紹了簡(jiǎn)單介紹Python2.x版本中的cmp()方法的使用,然而該方法在Python3.x版本中已并不再內(nèi)置...需要的朋友可以參考下
    2015-05-05
  • python中import cv2遇到的錯(cuò)誤及安裝方式

    python中import cv2遇到的錯(cuò)誤及安裝方式

    這篇文章主要介紹了python中import cv2遇到的錯(cuò)誤及安裝方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 深入理解Python中各種方法的運(yùn)作原理

    深入理解Python中各種方法的運(yùn)作原理

    這篇文章主要介紹了深入理解Python中各種方法的運(yùn)作原理,包括抽象方法和靜態(tài)方法和類方法等之間異同的比較,需要的朋友可以參考下
    2015-06-06
  • 解決pycharm安裝第三方庫(kù)失敗的問(wèn)題

    解決pycharm安裝第三方庫(kù)失敗的問(wèn)題

    這篇文章主要介紹了pycharm安裝第三方庫(kù)失敗的解決方法,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Pandas實(shí)現(xiàn)DataFrame的簡(jiǎn)單運(yùn)算、統(tǒng)計(jì)與排序

    Pandas實(shí)現(xiàn)DataFrame的簡(jiǎn)單運(yùn)算、統(tǒng)計(jì)與排序

    本文主要介紹了Pandas實(shí)現(xiàn)DataFrame的簡(jiǎn)單運(yùn)算、統(tǒng)計(jì)與排序,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • python利用正則表達(dá)式搜索單詞示例代碼

    python利用正則表達(dá)式搜索單詞示例代碼

    正則表達(dá)式本身是一種小型的、高度專業(yè)化的編程語(yǔ)言,下面這篇文章主要給大家介紹了關(guān)于python利用正則表達(dá)式實(shí)現(xiàn)搜索單詞的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-09-09
  • python如何拆分含有多種分隔符的字符串

    python如何拆分含有多種分隔符的字符串

    這篇文章主要為大家詳細(xì)介紹了python如何拆分含有多種分隔符的字符串,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • python 用戶交互輸入input的4種用法詳解

    python 用戶交互輸入input的4種用法詳解

    這篇文章主要介紹了python 用戶交互輸入input的4種用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論

宿松县| 定结县| 仲巴县| 贺兰县| 左贡县| 郑州市| 浦县| 普格县| 开化县| 神池县| 琼中| 万源市| 乌拉特中旗| 修武县| 青田县| 许昌市| 十堰市| 时尚| 洛阳市| 宜兰县| 新邵县| 宜丰县| 自贡市| 迭部县| 绥中县| 景德镇市| 桐城市| 阜平县| 安图县| 潜山县| 黎城县| 称多县| 三都| 防城港市| 龙岩市| 宜黄县| 通化市| 秦安县| 克拉玛依市| 镇平县| 云霄县|