国产探花免费观看_亚洲丰满少妇自慰呻吟_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):

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鹤壁市| 麻城市| 蚌埠市| 白城市| 上栗县| 宁阳县| 手游| 新晃| 贵溪市| 沅江市| 麟游县| 横峰县| 常德市| 福贡县| 伊吾县| 阆中市| 湖口县| 鹤庆县| 万安县| 灵台县| 民丰县| 卢湾区| 邮箱| 永济市| 上杭县| 旬邑县| 铜鼓县| 崇礼县| 武冈市| 辉县市| 额尔古纳市| 雷波县| 大兴区| 寿阳县| 子洲县| 夏津县| 文安县| 长沙市| 阿拉尔市| 固原市| 壶关县|