国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - Python中多線程及程序鎖淺析

Python中多線程及程序鎖淺析

2020-05-20 09:17腳本之家 Python

這篇文章主要介紹了Python中多線程及程序鎖淺析,本文用一個(gè)實(shí)例講解Python的多線程和程序鎖,需要的朋友可以參考下

Python中多線程使用到Threading模塊。Threading模塊中用到的主要的類是Thread,我們先來(lái)寫一個(gè)簡(jiǎn)單的多線程代碼:

復(fù)制代碼 代碼如下:


# coding : uft-8
__author__ = 'Phtih0n'
import threading

 

class MyThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        global n
        print n
        n += 1

if "__main__" == __name__:
    n = 0
    ThreadList = []
    for i in range(0, 10):
        t = MyThread()
        ThreadList.append(t)
    for t in ThreadList:
        t.start()
    for t in ThreadList:
        t.join

 

最普通的一個(gè)多線程小例子。我一筆帶過(guò)地講一講,我創(chuàng)建了一個(gè)繼承Thread類的子類MyThread,作為我們的線程啟動(dòng)類。按照規(guī)定,重寫Thread的run方法,我們的線程啟動(dòng)起來(lái)后會(huì)自動(dòng)調(diào)用該方法。于是我首先創(chuàng)建了10個(gè)線程,并將其加入列表中。再使用一個(gè)for循環(huán),開啟每個(gè)線程。在使用一個(gè)for循環(huán),調(diào)用join方法等待所有線程結(jié)束才退出主線程。

這段代碼看似簡(jiǎn)單,但實(shí)際上隱藏著一個(gè)很大的問(wèn)題,只是在這里沒有體現(xiàn)出來(lái)。你真的以為我創(chuàng)建了10個(gè)線程,并按順序調(diào)用了這10個(gè)線程,每個(gè)線程為n增加了1.實(shí)際上,有可能是A線程執(zhí)行了n++,再C線程執(zhí)行了n++,再B線程執(zhí)行n++。

這里涉及到一個(gè)“鎖”的問(wèn)題,如果有多個(gè)線程同時(shí)操作一個(gè)對(duì)象,如果沒有很好地保護(hù)該對(duì)象,會(huì)造成程序結(jié)果的不可預(yù)期(比如我們?cè)诿總€(gè)線程的run方法中加入一個(gè)time.sleep(1),并同時(shí)輸出線程名稱,則我們會(huì)發(fā)現(xiàn),輸出會(huì)亂七八糟。因?yàn)榭赡芪覀兊囊粋€(gè)print語(yǔ)句只打印出一半的字符,這個(gè)線程就被暫停,執(zhí)行另一個(gè)去了,所以我們看到的結(jié)果很亂),這種現(xiàn)象叫做“線程不安全”:

Python中多線程及程序鎖淺析

于是,Threading模塊為我們提供了一個(gè)類,Threading.Lock,鎖。我們創(chuàng)建一個(gè)該類對(duì)象,在線程函數(shù)執(zhí)行前,“搶占”該鎖,執(zhí)行完成后,“釋放”該鎖,則我們確保了每次只有一個(gè)線程占有該鎖。這時(shí)候?qū)σ粋€(gè)公共的對(duì)象進(jìn)行操作,則不會(huì)發(fā)生線程不安全的現(xiàn)象了。

于是,我們把代碼更改如下:

 

復(fù)制代碼 代碼如下:


# coding : uft-8
__author__ = 'Phtih0n'
import threading, time

 

class MyThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        global n, lock
        time.sleep(1)
        if lock.acquire():
            print n , self.name
            n += 1
            lock.release()

if "__main__" == __name__:
    n = 1
    ThreadList = []
    lock = threading.Lock()
    for i in range(1, 200):
        t = MyThread()
        ThreadList.append(t)
    for t in ThreadList:
        t.start()
    for t in ThreadList:
        t.join()

 

最后執(zhí)行結(jié)果:

Python中多線程及程序鎖淺析

我們看到,我們先建立了一個(gè)threading.Lock類對(duì)象lock,在run方法里,我們使用lock.acquire()獲得了這個(gè)鎖。此時(shí),其他的線程就無(wú)法再獲得該鎖了,他們就會(huì)阻塞在“if lock.acquire()”這里,直到鎖被另一個(gè)線程釋放:lock.release()。

所以,if語(yǔ)句中的內(nèi)容就是一塊完整的代碼,不會(huì)再存在執(zhí)行了一半就暫停去執(zhí)行別的線程的情況。所以最后結(jié)果是整齊的。

就如同在java中,我們使用synchronized關(guān)鍵字修飾一個(gè)方法,目的一樣,讓某段代碼被一個(gè)線程執(zhí)行時(shí),不會(huì)打斷跳到另一個(gè)線程中。

這是多線程占用一個(gè)公共對(duì)象時(shí)候的情況。如果多個(gè)線程要調(diào)用多個(gè)現(xiàn)象,而A線程調(diào)用A鎖占用了A對(duì)象,B線程調(diào)用了B鎖占用了B對(duì)象,A線程不能調(diào)用B對(duì)象,B線程不能調(diào)用A對(duì)象,于是一直等待。這就造成了線程“死鎖”。

Threading模塊中,也有一個(gè)類,RLock,稱之為可重入鎖。該鎖對(duì)象內(nèi)部維護(hù)著一個(gè)Lock和一個(gè)counter對(duì)象。counter對(duì)象記錄了acquire的次數(shù),使得資源可以被多次require。最后,當(dāng)所有RLock被release后,其他線程才能獲取資源。在同一個(gè)線程中,RLock.acquire可以被多次調(diào)用,利用該特性,可以解決部分死鎖問(wèn)題。

死鎖問(wèn)題很復(fù)雜,多年來(lái)人們想出了很多算法來(lái)解決它。我就不再多說(shuō),具體還是要大家參閱幫助文檔。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产日产精品一区二区三区四区 | 精品久久久久一区二区国产 | 日韩福利一区二区 | 免费成人在线网站 | 韩国精品 | www.欧美精品 | 天堂伊人网 | 国产精品亚洲视频 | 中文字幕大全 | 日日干狠狠干 | 欧美天堂 | 国产噜噜噜噜噜久久久久久久久 | 天天射天天干 | 婷婷综合激情 | 成人精品一区二区 | 国产成人高清视频 | 精品久久免费 | 一区二区三区精品视频 | 伊人色私人影院蜜桃va | 日日夜夜一区二区 | 国产福利在线播放 | 神马电影午夜 | 五月天激情综合网 | 亚洲视频精品在线 | 污视频在线观看免费 | 91亚洲一区 | 久久久国产一区二区三区 | 久久综合中文字幕 | 日韩福利视频 | 久久新| 四季久久免费一区二区三区四区 | 欧美日韩三级 | 国产成人精品久久二区二区 | 一区高清 | 久久久婷婷一区二区三区不卡 | 亚洲美女久久 | 一区二区三区高清 | 日韩中文字幕一区二区 | 四虎影视永久免费观看 | 国产精品久久久久久久久久小说 | 亚洲精品www久久久久久广东 |