day18-多線程

1. 耗時(shí)操作

  1. 耗時(shí)操作放到主線程中的問題:
    耗時(shí)操作放到主線程中,會(huì)阻塞線程
    多個(gè)耗時(shí)操作都放到一個(gè)線程中執(zhí)行,最終執(zhí)行的時(shí)間是兩個(gè)耗時(shí)操作的時(shí)間和
  2. 怎么解決問題门烂?
    使用多線程(創(chuàng)建多個(gè)線程)

2. 多線程技術(shù)1

  1. python內(nèi)置的threading模塊鲤嫡,可以支持多線程
  2. 所有的進(jìn)程默認(rèn)都有一個(gè)線程(一般稱為主線程),其他的線程叫子線程
  3. 如果想要在進(jìn)程中添加其他的線程柿祈,就創(chuàng)建線程對(duì)象
import threading
import time

def download(file, time1):
    print('開始下載', file)
    time.sleep(time1)
    print(file, '下載結(jié)束')

if __name__ == '__main__':
    print('hello')
  1. 創(chuàng)建線程對(duì)象
    """
    target:需要在子線程中執(zhí)行的函數(shù)
    args:調(diào)用函數(shù)的實(shí)參列表(參數(shù)類型是列表)
    返回值:線程對(duì)象
    """
    t1 = threading.Thread(target=download, args=['愛情公寓', 5])
  1. 在子線程中執(zhí)行任務(wù)
    t1.start()
    t2 = threading.Thread(target=download, args=['我的兄弟叫順溜', 3])
    t2.start()
    # download('天線寶寶')
    # download('我的兄弟叫順溜')
    print('============')
運(yùn)行結(jié)果:
hello
開始下載 愛情公寓
開始下載 我的兄弟叫順溜
============
我的兄弟叫順溜 下載結(jié)束
愛情公寓 下載結(jié)束

3. 多線程技術(shù)2

方式2:寫一個(gè)自己的線程類

  1. 寫一個(gè)類哈误,繼承自Thread類
  2. 重寫run方法哩至,在里面規(guī)定需要在子線程中執(zhí)行的任務(wù)
  3. 實(shí)現(xiàn)在子線程中執(zhí)行任務(wù)對(duì)應(yīng)的功能,如果需要參數(shù)蜜自,通過類的對(duì)象屬性來傳值
from threading import Thread
import requests
import re

# 下載數(shù)據(jù)
class DownloadThread(Thread):
    """下載類"""
    def __init__(self, file_path):
        super().__init__()
        self.file_path = file_path

    def run(self):
        """run方法"""
        """
        1. 寫在這個(gè)方法里面的內(nèi)容就是在子線程中執(zhí)行的內(nèi)容
        2. 這個(gè)方法不要直接調(diào)用
        """
        print('開始下載...')
        response = requests.request('GET', self.file_path)
        data = response.content

        # 獲取文件后綴
        suffix = re.search(r'\.\w+$', self.file_path).group()

        with open('./abc'+suffix, 'wb') as f:
            f.write(data)
        print('下載完成F忻病!V剀箭阶!')

if __name__ == '__main__':
    print('哇哈哈哈哈哈哈')
    t1 = DownloadThread('http://10.7.181.117/shareX/Git.exe')
    # 通過start間接調(diào)用run方法,run方法中的任務(wù)在子線程中執(zhí)行
    t1.start()
    # 直接調(diào)用run方法戈鲁,run方法中的任務(wù)在當(dāng)前線程中執(zhí)行
    # t1.run()

    t2 = DownloadThread('https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1533720058151&di=766b5c97653351e805c85881ecaa57d0&imgtype=0&src=http%3A%2F%2Fx.itunes123.com%2Fuploadfiles%2Fb2ab55461e6dc7a82895c7425fc89017.jpg')
    t2.start()

    print('嗚哇哇哇哇哇哇')
運(yùn)行結(jié)果:
哇哈哈哈哈哈哈
開始下載...
開始下載...
嗚哇哇哇哇哇哇
下載完成3鸩巍!\癖恕冈敛!

4. 多線程應(yīng)用

import socket
from threading import Thread

class ConversationThread(Thread):
    """在子線程中處理不同的客戶端會(huì)話"""
    """
    python中可以在函數(shù)參數(shù)的后面加一個(gè)冒號(hào),來對(duì)參數(shù)的類型進(jìn)行說明(說明并不是強(qiáng)制轉(zhuǎn)換)
    """
    def __init__(self, conversation:socket.socket, address):
        super().__init__()
        self.conversation = conversation
        self.address = address

    def run(self):
        while True:
            self.conversation.send('你好'.encode())
            print(self.address, self.conversation.recv(1024).decode(encoding='utf-8'))



if __name__ == '__main__':
    server = socket.socket()
    server.bind(('10.7.181.93', 8080))
    server.listen(10)

    while True:
        conversation, address = server.accept()
        t = ConversationThread(conversation, address)
        t.start()

        # while True:
        #     conversation.send('來了啊鸣皂,小伙子抓谴!'.encode())
        #     print(conversation.recv(1024).decode(encoding='utf-8'))

5. join函數(shù)

"""__author__ = Percy"""
from threading import Thread, current_thread
import time
from random import randint

class Download(Thread):
    def __init__(self, file):
        # 這里父類的init方法必須調(diào)用,否則當(dāng)前這個(gè)類創(chuàng)建的對(duì)象就沒有新的線程
        super().__init__()
        self.file = file

    def run(self):
        print(current_thread())
        print('%s開始下載了哈...' % self.file)
        time.sleep(randint(4, 8))
        print('%s下載結(jié)束了哈D臁0┭埂!' % self.file)

if __name__ == '__main__':
    # time.time():獲取當(dāng)前時(shí)間 -- 時(shí)間戳
    start_time = time.time()
    t1 = Download('我的兄弟叫順溜.mp4')
    t1.start()

    t2 = Download('黑貓警長(zhǎng).mp4')
    t2.start()

    print('哇咔咔卡卡卡卡卡')

    # 獲取當(dāng)前線程
    """
    主線程:MainThread
    子線程:Thread-數(shù)字(數(shù)字從1開始)
    """
    print(current_thread())
    # 如果一個(gè)任務(wù)想要在另外一個(gè)子線程中的任務(wù)執(zhí)行完成后再執(zhí)行荆陆,就在當(dāng)前任務(wù)前用子線程對(duì)象調(diào)用join方法
    # 所以join也會(huì)阻塞線程滩届,阻塞到對(duì)應(yīng)的子線程中任務(wù)執(zhí)行完為止
    t1.join()
    t2.join()
    end_time = time.time()
    print('總共消耗時(shí)間:%.2f' % (end_time - start_time))
運(yùn)行結(jié)果:
<Download(Thread-1, started 14484)>
我的兄弟叫順溜.mp4開始下載了哈...
<Download(Thread-2, started 14672)>
黑貓警長(zhǎng).mp4開始下載了哈...
哇咔咔卡卡卡卡卡
<_MainThread(MainThread, started 18356)>
黑貓警長(zhǎng).mp4下載結(jié)束了哈!1惶洹帜消!
我的兄弟叫順溜.mp4下載結(jié)束了哈!Eㄌ濉泡挺!
總共消耗時(shí)間:8.00
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市命浴,隨后出現(xiàn)的幾起案子娄猫,更是在濱河造成了極大的恐慌,老刑警劉巖生闲,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媳溺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡碍讯,警方通過查閱死者的電腦和手機(jī)悬蔽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捉兴,“玉大人屯阀,你說我怎么就攤上這事缅帘。” “怎么了难衰?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵弯囊,是天一觀的道長(zhǎng)岂津。 經(jīng)常有香客問我吕晌,道長(zhǎng)熄诡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任鳄虱,我火速辦了婚禮弟塞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拙已。我一直安慰自己决记,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布倍踪。 她就那樣靜靜地躺著系宫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪建车。 梳的紋絲不亂的頭發(fā)上扩借,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音缤至,去河邊找鬼潮罪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛领斥,可吹牛的內(nèi)容都是我干的嫉到。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼月洛,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼何恶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起膊存,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤导而,失蹤者是張志新(化名)和其女友劉穎忱叭,沒想到半個(gè)月后隔崎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡韵丑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年爵卒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撵彻。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钓株,死狀恐怖实牡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情轴合,我是刑警寧澤创坞,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站受葛,受9級(jí)特大地震影響题涨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜总滩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一纲堵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闰渔,春花似錦席函、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至炕舵,卻和暖如春何之,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咽筋。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工溶推, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奸攻。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓蒜危,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親睹耐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辐赞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,386評(píng)論 8 265
  • 01.多線程技術(shù)1 02.多線程技術(shù)2 03.多線程應(yīng)用 04.join 函數(shù) 耗時(shí)操作 1.耗時(shí)操作放到主線程中...
    zhazhaK丶閱讀 151評(píng)論 0 1
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,101評(píng)論 1 32
  • iOS多線程編程 基本知識(shí) 1. 進(jìn)程(process) 進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序硝训,就是一段程序的執(zhí)...
    陵無山閱讀 6,050評(píng)論 1 14
  • 正月十九响委,宜祈福。 ‘老板窖梁,一碗牛肉粉赘风,加雜加雞蛋!’纵刘,能吃上這樣一頓午餐是幸福的邀窃,扳著油炸出來酥脆的辣椒,像本地...
    鄭男閱讀 152評(píng)論 1 0