国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python中多線程及程序鎖淺析

2020-02-23 06:19:41
字體:
來源:轉載
供稿:網友

Python中多線程使用到Threading模塊。Threading模塊中用到的主要的類是Thread,我們先來寫一個簡單的多線程代碼:
代碼如下:
# 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

最普通的一個多線程小例子。我一筆帶過地講一講,我創建了一個繼承Thread類的子類MyThread,作為我們的線程啟動類。按照規定,重寫Thread的run方法,我們的線程啟動起來后會自動調用該方法。于是我首先創建了10個線程,并將其加入列表中。再使用一個for循環,開啟每個線程。在使用一個for循環,調用join方法等待所有線程結束才退出主線程。

這段代碼看似簡單,但實際上隱藏著一個很大的問題,只是在這里沒有體現出來。你真的以為我創建了10個線程,并按順序調用了這10個線程,每個線程為n增加了1.實際上,有可能是A線程執行了n++,再C線程執行了n++,再B線程執行n++。

這里涉及到一個“鎖”的問題,如果有多個線程同時操作一個對象,如果沒有很好地保護該對象,會造成程序結果的不可預期(比如我們在每個線程的run方法中加入一個time.sleep(1),并同時輸出線程名稱,則我們會發現,輸出會亂七八糟。因為可能我們的一個print語句只打印出一半的字符,這個線程就被暫停,執行另一個去了,所以我們看到的結果很亂),這種現象叫做“線程不安全”:

于是,Threading模塊為我們提供了一個類,Threading.Lock,鎖。我們創建一個該類對象,在線程函數執行前,“搶占”該鎖,執行完成后,“釋放”該鎖,則我們確保了每次只有一個線程占有該鎖。這時候對一個公共的對象進行操作,則不會發生線程不安全的現象了。

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

代碼如下:
# coding : uft-8
__author__ = 'Phtih0n'
import threading, time

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 湛江市| 郑州市| 新绛县| 淄博市| 永吉县| 盐城市| 郁南县| 霍林郭勒市| 犍为县| 泸溪县| 安宁市| 灯塔市| 金川县| 定安县| 行唐县| 沁源县| 长治县| 锡林浩特市| 台中县| 镇江市| 象州县| 民权县| 伊春市| 仙游县| 乐山市| 荥阳市| 自治县| 邯郸市| 游戏| 靖宇县| 习水县| 罗江县| 苍山县| 青州市| 海口市| 二连浩特市| 太原市| 确山县| 玛沁县| 西乌珠穆沁旗| 凤凰县|