2018-09-13多線程

01-多線程技術(shù)

1.主線程
每個進程默認都會有一個線程,這個線程我們一般叫作主線程
默認情況下,我們所有的代碼都在主線程中執(zhí)行的
2.子線程
一個進程可以有多個線程骗露,除了主線程以外掠拳,其它的線程需要手動添加
3.threading是Python中的一個內(nèi)置模塊,用來支持多線程
a.Thread類
Thread類的對象就是線程對象噪裕,需要線程的時候,就創(chuàng)建這個類或者這個類的子類對象
b.threading.currentThread()---》用來獲取當(dāng)前線程對象


import threading
import datetime
import time
# 下載兩個電影
def download(file):
    print(file + '開始下載:', datetime.datetime.now())
    # 讓線程阻塞10秒
    time.sleep(10)
    print(file+'下載結(jié)束', datetime.datetime.now())

if __name__ == '__main__':
    # threading.Thread
    print('主線程中的代碼')

    print(threading.currentThread())

    # 1.在主線程中下載兩個電影:用時20s
    # download('西虹市首富')
    download('沉默的羔羊')

    # 2.在子線程中下載兩個電影:用時10s
    '''
    Tread(target,args)
    target:需要在子線程中調(diào)用的函數(shù)的函數(shù)名
    args:函數(shù)的實參
    返回值:創(chuàng)建好的線程對象
    '''
    t1 = threading.Thread(target= download,args=('西虹市首富',))
    # 開始執(zhí)行t1對應(yīng)的線程任務(wù)
    t1.start()

    # t2 = threading.Thread(target= download,args=('沉默的羔羊',))
    # # 想要在子線程中執(zhí)行任務(wù)宋渔,必須通過線程對象調(diào)用start方法才行
    # t2.start()
    print('==========')

02-面向?qū)ο蟮亩嗑€程技術(shù)

1.聲明一個類繼承自Thread類
2.將需要在子線程中執(zhí)行的任務(wù)放到run方法中
3.在需要子線程的位置去創(chuàng)建這個類的對象州疾,然后用對象調(diào)用start方法去執(zhí)行run中的任務(wù)

from threading import Thread
import datetime
import time
from random import randint

注意:繼承的時候可以繼承自己寫的類,也可以繼承別人寫的類或者系統(tǒng)寫的類
class DownloadThread(Thread):
    '''下載線程類'''
    def __init__(self,file):
        super().__init__()
        self.file = file

    def run(self):
        print(self.file + '開始下載:',datetime.datetime.now())
        time.sleep(randint(5,10))
        print(self.file + '下載結(jié)束:',datetime.datetime.now())

if __name__ == '__main__':
    print('==========')
    t1 = DownloadThread('西虹市首富')
    t1.start()

    t2 = DownloadThread('黑客帝國')
    t2.start()

    print('+-+-+-+-+-')

03-join方法的使用

如果希望某個線程結(jié)束后才進行的操作皇拣,就用那個線程調(diào)用join函數(shù)

from threading import Thread
from random import randint
import time
import datetime

class DownloadThread(Thread):
    def __init__(self,file):
        super().__init__()
        self.file = file

    def run(self):
        print(self.file+'開始下載',datetime.datetime.now())
        time.sleep(randint(5,15))
        print(self.file+'下載結(jié)束',datetime.datetime.now())


if __name__ == '__main__':

    t1 = DownloadThread('美麗人生')
    t2 = DownloadThread('怦然心動')

    start = time.time()

    tim1 = t1.start()
    tim2 = t2.start()

# 在兩個子線程中下載兩個電影严蓖,在主線程中統(tǒng)計兩個電影下載的總時間

# 系統(tǒng)t1和t2中的代碼結(jié)束后才執(zhí)行下面的代碼
    t1.join()  # 這句代碼后面的代碼在t1對應(yīng)的線程結(jié)束后才執(zhí)行
    t2.join()
    end = time.time()
    print(end-start)

04-線程間的數(shù)據(jù)共享

同步鎖(RLock)和互斥鎖(Lock)
模擬多個人對同一個賬號進行操作

import time
from threading import Thread,Lock

class Account:
    '''賬號類'''
    def __init__(self,balance):
        # 余額
        self.balance = balance
        # 創(chuàng)建鎖的對象
        self.lock = Lock()

    # 存錢過程:讀出原來的余額,確定錢的一系列操作氧急,將原來的余額加上存的錢颗胡,產(chǎn)生新的余額,再保存
    def save_money(self,amount):
        '''存錢'''
        print('開始存錢')
        加鎖
        self.lock.acquire()
        # 獲取原來的余額
        old_amount =  self.balance
        # 模擬時間消耗
        time.sleep(5)
        # 修改余額
        self.balance = old_amount + amount
        print('存錢成功吩坝,余額是:',self.balance)
        解鎖
        self.lock.release()

    def get_money(self,amount):
        '''取錢'''
        print('開始取錢')
        加鎖
        self.lock.acquire()
        # 獲取原來的余額
        old_amount = self.balance
        if old_amount < amount:
            print('余額不足')
            return
        time.sleep(5)
        self.balance = old_amount - amount
        print('取錢成功,余額是:',self.balance)
        解鎖
        self.lock.release()

    def show_balance(self):
        print('當(dāng)前余額:%d'% self.balance)

if __name__ == '__main__':
    # 創(chuàng)建賬號
    account = Account(1000)

    # account.save_money(200)
    # account.save_money(100)
    # account.show_balance()
    當(dāng)多個線程對一個數(shù)據(jù)進行操作時毒姨,可能會出現(xiàn)數(shù)據(jù)混亂的問題
  
    t1 = Thread(target= account.save_money,args= (200,))
    t2 = Thread(target=account.save_money, args=(300,))

    t1.start()
    t2.start()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钉寝,隨后出現(xiàn)的幾起案子弧呐,更是在濱河造成了極大的恐慌,老刑警劉巖嵌纲,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俘枫,死亡現(xiàn)場離奇詭異,居然都是意外死亡逮走,警方通過查閱死者的電腦和手機鸠蚪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茅信,你說我怎么就攤上這事盾舌。” “怎么了蘸鲸?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵妖谴,是天一觀的道長。 經(jīng)常有香客問我棚贾,道長窖维,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任妙痹,我火速辦了婚禮铸史,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘怯伊。我一直安慰自己琳轿,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布耿芹。 她就那樣靜靜地躺著崭篡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吧秕。 梳的紋絲不亂的頭發(fā)上琉闪,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音砸彬,去河邊找鬼颠毙。 笑死,一個胖子當(dāng)著我的面吹牛砂碉,可吹牛的內(nèi)容都是我干的蛀蜜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼增蹭,長吁一口氣:“原來是場噩夢啊……” “哼滴某!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起滋迈,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤霎奢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后饼灿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椰憋,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年赔退,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡硕旗,死狀恐怖窗骑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情漆枚,我是刑警寧澤创译,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站墙基,受9級特大地震影響软族,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜残制,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一立砸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧初茶,春花似錦颗祝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至折汞,卻和暖如春倔幼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爽待。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工损同, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人堕伪。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓揖庄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親欠雌。 傳聞我的和親對象是個殘疾皇子蹄梢,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 進程和線程 進程 所有運行中的任務(wù)通常對應(yīng)一個進程,當(dāng)一個程序進入內(nèi)存運行時,即變成一個進程.進程是處于運行過程中...
    勝浩_ae28閱讀 5,106評論 0 23
  • 一文讀懂Python多線程 1、線程和進程 計算機的核心是CPU富俄,它承擔(dān)了所有的計算任務(wù)禁炒。它就像一座工廠,時刻在運...
    星丶雲(yún)閱讀 1,453評論 0 4
  • 一. 操作系統(tǒng)概念 操作系統(tǒng)位于底層硬件與應(yīng)用軟件之間的一層.工作方式: 向下管理硬件,向上提供接口.操作系統(tǒng)進行...
    月亮是我踢彎得閱讀 5,965評論 3 28
  • 林炳文Evankaka原創(chuàng)作品霍比。轉(zhuǎn)載自http://blog.csdn.net/evankaka 本文主要講了ja...
    ccq_inori閱讀 654評論 0 4
  • ?? 這是許多開發(fā)者在使用阿里SDK遇到的坑之一幕袱,當(dāng)我們按照阿里的指示將它所說的SDK寶導(dǎo)入工程中,并按照指示加...
    Harely閱讀 124評論 0 0