多任務-線程

多任務

有很多的場景中的事情是同時進行的,比如開車的時候 手和腳共同來駕駛汽車僧界,再比如唱歌跳舞也是同時進行的

程序中模擬多任務

import time

def sing():

? ? for i in range(3):

? ? ? ? print("正在唱歌...%d"%i)

? ? ? ? time.sleep(1)

def dance():

? ? for i in range(3):

? ? ? ? print("正在跳舞...%d"%i)

? ? ? ? time.sleep(1)

if __name__ == '__main__':

? ? sing()

? ? dance()

多任務的理解


并行:真的多任務 cpu大于當前執(zhí)行的任務

并發(fā):假的多任務 cpu小于當前執(zhí)行的任務

線程完成多任務

import threading

import time

def demo():

? ? # 子線程

? ? print("hello girls")

? ? time.sleep(1)


if __name__ == "__main__":

? ? for i in range(5):

? ? ? ? t = threading.Thread(target=demo)

? ? ? ? t.start()

查看線程數量

threading.enumerate() 查看當前線程的數量

驗證子線程的執(zhí)行與創(chuàng)建

當調用Thread的時候侨嘀,不會創(chuàng)建線程。

當調用Thread創(chuàng)建出來的實例對象的start方法的時候捂襟,才會創(chuàng)建線程以及開始運行這個線程咬腕。

繼承Thread類創(chuàng)建線程

import threading

import time

class A(threading.Thread):


? ? def __init__(self,name):

? ? ? ? super().__init__(name=name)


? ? def run(self):

? ? ? ? for i in range(5):

? ? ? ? ? ? print(i)

if __name__ == "__main__":

? ? t = A('test_name')? ?

? ? t.start()

多線程共享全局變量(線程間通信)

修改全局變量一定需要加global嘛?

在一個函數中,對全局變量進行修改的時候葬荷,是否要加global要看是否對全局變量的指向進行了修改涨共,如果修改了指向,那么必須使用global闯狱,僅僅是修改了指向的空間中的數據煞赢,此時不用必須使用global

多線程參數-args

threading.Thread(target=test, args=(num,))

共享全局變量資源競爭

一個線程寫入,一個線程讀取,沒問題,如果兩個線程都寫入呢?

互斥鎖

當多個線程幾乎同時修改某一個共享數據的時候哄孤,需要進行同步控制

某個線程要更改共享數據時照筑,先將其鎖定,此時資源的狀態(tài)為"鎖定",其他線程不能改變瘦陈,只到該線程釋放資源凝危,將資源的狀態(tài)變成"非鎖定",其他的線程才能再次鎖定該資源晨逝《昴互斥鎖保證了每次只有一個線程進行寫入操作,從而保證了多線程情況下數據的正確性捉貌。

創(chuàng)建鎖

mutex = threading.Lock()

鎖定

mutex.acquire()

解鎖

mutex.release()

死鎖

在線程間共享多個資源的時候支鸡,如果兩個線程分別占有一部分資源并且同時等待對方的資源冬念,就會造成死鎖。

import threading

import time

class MyThread1(threading.Thread):

? ? def run(self):

? ? ? ? # 對mutexA上鎖

? ? ? ? mutexA.acquire()

? ? ? ? # mutexA上鎖后牧挣,延時1秒急前,等待另外那個線程 把mutexB上鎖

? ? ? ? print(self.name+'----do1---up----')

? ? ? ? time.sleep(1)

? ? ? ? # 此時會堵塞,因為這個mutexB已經被另外的線程搶先上鎖了

? ? ? ? mutexB.acquire()

? ? ? ? print(self.name+'----do1---down----')

? ? ? ? mutexB.release()

? ? ? ? # 對mutexA解鎖

? ? ? ? mutexA.release()

class MyThread2(threading.Thread):

? ? def run(self):

? ? ? ? # 對mutexB上鎖

? ? ? ? mutexB.acquire()

? ? ? ? # mutexB上鎖后瀑构,延時1秒裆针,等待另外那個線程 把mutexA上鎖

? ? ? ? print(self.name+'----do2---up----')

? ? ? ? time.sleep(1)

? ? ? ? # 此時會堵塞,因為這個mutexA已經被另外的線程搶先上鎖了

? ? ? ? mutexA.acquire()

? ? ? ? print(self.name+'----do2---down----')

? ? ? ? mutexA.release()

? ? ? ? # 對mutexB解鎖

? ? ? ? mutexB.release()

mutexA = threading.Lock()

mutexB = threading.Lock()

if __name__ == '__main__':

? ? t1 = MyThread1()

? ? t2 = MyThread2()

? ? t1.start()

? ? t2.start()

避免死鎖

????程序設計時要盡量避免

????添加超時時間等

Queue線程

在線程中寺晌,訪問一些全局變量世吨,加鎖是一個經常的過程。如果你是想把一些數據存儲到某個隊列中呻征,那么Python內置了一個線程安全的模塊叫做queue模塊耘婚。Python中的queue模塊中提供了同步的、線程安全的隊列類怕犁,包括FIFO(先進先出)隊列Queue边篮,LIFO(后入先出)隊列LifoQueue。這些隊列都實現(xiàn)了鎖原語(可以理解為原子操作奏甫,即要么不做戈轿,要么都做完),能夠在多線程中直接使用阵子∷急可以使用隊列來實現(xiàn)線程間的同步。

初始化Queue(maxsize):創(chuàng)建一個先進先出的隊列挠进。

qsize():返回隊列的大小色乾。

empty():判斷隊列是否為空。

full():判斷隊列是否滿了领突。

get():從隊列中取最后一個數據暖璧。

put():將一個數據放到隊列中。

線程同步

天貓精靈:小愛同學

小愛同學:在

天貓精靈:現(xiàn)在幾點了君旦?

小愛同學:你猜猜現(xiàn)在幾點了

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末澎办,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子金砍,更是在濱河造成了極大的恐慌局蚀,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恕稠,死亡現(xiàn)場離奇詭異琅绅,居然都是意外死亡,警方通過查閱死者的電腦和手機鹅巍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門千扶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來料祠,“玉大人,你說我怎么就攤上這事县貌∈跆眨” “怎么了凑懂?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵煤痕,是天一觀的道長。 經常有香客問我接谨,道長摆碉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任脓豪,我火速辦了婚禮巷帝,結果婚禮上,老公的妹妹穿的比我還像新娘扫夜。我一直安慰自己楞泼,他們只是感情好,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布笤闯。 她就那樣靜靜地躺著堕阔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颗味。 梳的紋絲不亂的頭發(fā)上超陆,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音浦马,去河邊找鬼时呀。 笑死,一個胖子當著我的面吹牛晶默,可吹牛的內容都是我干的谨娜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼磺陡,長吁一口氣:“原來是場噩夢啊……” “哼趴梢!你這毒婦竟也來了?” 一聲冷哼從身側響起仅政,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤垢油,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后圆丹,有當地人在樹林里發(fā)現(xiàn)了一具尸體滩愁,經...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年辫封,在試婚紗的時候發(fā)現(xiàn)自己被綠了硝枉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片廉丽。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖妻味,靈堂內的尸體忽然破棺而出正压,到底是詐尸還是另有隱情,我是刑警寧澤责球,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布焦履,位于F島的核電站,受9級特大地震影響雏逾,放射性物質發(fā)生泄漏嘉裤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一栖博、第九天 我趴在偏房一處隱蔽的房頂上張望屑宠。 院中可真熱鬧,春花似錦仇让、人聲如沸典奉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卫玖。三九已至,卻和暖如春蠢正,著一層夾襖步出監(jiān)牢的瞬間骇笔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工嚣崭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笨触,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓雹舀,卻偏偏與公主長得像芦劣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子说榆,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內容

  • 一文讀懂Python多線程 1虚吟、線程和進程 計算機的核心是CPU,它承擔了所有的計算任務签财。它就像一座工廠串慰,時刻在運...
    星丶雲閱讀 1,453評論 0 4
  • 寫在前面的話 代碼中的# > 表示的是輸出結果 輸入 使用input()函數 用法 注意input函數輸出的均是字...
    FlyingLittlePG閱讀 2,755評論 0 8
  • 線程 操作系統(tǒng)線程理論 線程概念的引入背景 進程 之前我們已經了解了操作系統(tǒng)中進程的概念邦鲫,程序并不能單獨運行,只有...
    go以恒閱讀 1,641評論 0 6
  • 1.多任務 在計算機中,操作系統(tǒng)可以同時運行多個任務,這就是多任務庆捺。那么如何解決多個任務同時運行呢古今,那就需要用到多...
    瀟瀟雨歇_安然閱讀 376評論 0 1
  • 一、線程介紹 1.1滔以、線程捉腥,有時被稱為輕量進程(Lightweight Process,LWP)你画,是程序執(zhí)行流的最...
    IIronMan閱讀 1,325評論 0 2