2019-01-17 day19 線程\子線程對(duì)象?。?!

01子線程對(duì)象

import time
from datetime import datetime
# python多線程技術(shù)對(duì)應(yīng)的模塊
import threading

"""
默認(rèn)情況下,一個(gè)進(jìn)程有且只有一個(gè)線程,這個(gè)線程叫主線程

threading模塊中的Thread類就是線程類,這個(gè)類的對(duì)象就是線程對(duì)象,一個(gè)線程對(duì)象對(duì)應(yīng)一個(gè)子線程。
(需要一個(gè)子線程就創(chuàng)建一個(gè)Thread類的對(duì)象)
"""


def download(file):
    print('%s開(kāi)始下載' % file, datetime.now())
    # sleep(時(shí)間) - 程序執(zhí)行到這個(gè)位置等待指定的時(shí)候再接著往后面執(zhí)行
    time.sleep(10)
    print('%s下載結(jié)束' % file, datetime.now())


def main():
    print('程序開(kāi)始')
    # 1.在主線程中下載三個(gè)電影(總耗時(shí)30秒)
    # download('槍王之王.mp4')
    # download('開(kāi)國(guó)大典')
    # download('黃金國(guó).mp4')

    # 2.在三個(gè)子線程中同時(shí)下載三個(gè)電影
    """
    Thread(target= , args= )  -  創(chuàng)建子線程對(duì)象
    說(shuō)明:
    target - Function, 需要傳一個(gè)函數(shù)(這個(gè)函數(shù)中的內(nèi)容會(huì)在子線程中執(zhí)行)
    args - target對(duì)應(yīng)的函數(shù)的參數(shù)
    當(dāng)通過(guò)創(chuàng)建好的子線程對(duì)象調(diào)用start方法的時(shí)候,會(huì)自動(dòng)在子線程中調(diào)用target對(duì)應(yīng)的函數(shù),并且將args中的值作為實(shí)參
    
    """
    # 創(chuàng)建線程對(duì)象
    t1 = threading.Thread(target=download, args=('槍王之王.mp4', ))
    t2 = threading.Thread(target=download, args=('開(kāi)國(guó)大典.mp4', ))
    t3 = threading.Thread(target=download, args=('黃金國(guó).mp4',))
    # 開(kāi)始執(zhí)行t1對(duì)應(yīng)的子線程中的任務(wù)(實(shí)質(zhì)就是在子線程中調(diào)用target對(duì)應(yīng)的函數(shù))
    t1.start()
    t2.start()
    t3.start()

    # 線程對(duì)象調(diào)用join方法,會(huì)導(dǎo)致join后的代碼在線程中的任務(wù)結(jié)束后才執(zhí)行
    t1.join()
    print('下載結(jié)束!')

    print('===================')


if __name__ == '__main__':
    main()

02Thread子類

import threading
import time
from datetime import datetime
import requests
import re

"""
可以通過(guò)寫(xiě)一個(gè)類繼承Thread類,來(lái)創(chuàng)建屬于自己的線程類。
1.聲明類繼承Thread
2.重寫(xiě)run方法。這個(gè)方法中的任務(wù)就是需要在子線程中執(zhí)行的任務(wù)
3.需要線程對(duì)象的時(shí)候,創(chuàng)建當(dāng)前聲明的類的對(duì)象;然后通過(guò)start方法在子線程中去執(zhí)行run方法中的任務(wù)
"""


class DownloadImageThread(threading.Thread):
    def __init__(self, url):
        super().__init__()
        self.url = url

    def run(self):
        print('下載圖片開(kāi)始時(shí)間:', datetime.now())
        response = requests.get(self.url)
        result = response.content
        file_name = re.split(r'/', self.url)[-1]
        with open('files/'+file_name, 'wb') as f:
            f.write(result)
        print('下載圖片結(jié)束時(shí)間:', datetime.now())


class DownloadThread(threading.Thread):
    """下載類"""
    def __init__(self, file):
        super().__init__()
        self.file = file

    def run(self):
        print('開(kāi)始下載:'+self.file)
        print('run:', threading.current_thread())
        time.sleep(10)
        print('%s下載結(jié)束' % self.file)
        # time.sleep(10)
        # print('%s下載結(jié)束' % file, datetime.now())


def main():
    # 獲取當(dāng)前線程
    print(threading.current_thread())
    t1 = DownloadThread('沉默的羔羊.mp4')
    t2 = DownloadThread('恐怖游輪.mp4')
    # 調(diào)用start的時(shí)候會(huì)自動(dòng)在子線程中調(diào)用run方法
    t1.start()
    t2.start()

    # 注意:如果直接用對(duì)象調(diào)用run方法,run方法中的任務(wù)會(huì)在主線程執(zhí)行
    # t1.run()

    t3 = DownloadImageThread('https://image.haha.mx/2015/12/04/middle/2082175_c5c3cc05eb73e4023149e663475d3ab4_1449192201.gif')
    t3.start()


if __name__ == '__main__':
    main()

03join

from threading import Thread
import requests
import re
import time


class DownloadThread2(Thread):
    """下載類"""
    def __init__(self, file, time):
        super().__init__()
        self.file = file
        self.time = time

    def run(self):
        print('開(kāi)始下載:'+self.file)
        # t = randint(5, 10)
        time.sleep(self.time)
        print('%s下載結(jié)束, 總共耗時(shí):%ds' % (self.file, self.time))


class DownloadImageThread(Thread):
    def __init__(self, url):
        super().__init__()
        self.url = url

    def run(self):
        # 開(kāi)始下載
        file_name = re.split(r'/', self.url)[-1]
        print(file_name)
        print('%s開(kāi)始下載' % file_name)
        response = requests.get(self.url)
        content = response.content

        with open('images/'+file_name, 'bw') as f:
            f.write(content)

        print('%s下載結(jié)束' % file_name)


def creat_thread():
    t1 = DownloadThread2('電影1', 6)
    t2 = DownloadThread2('電影2', 4)
    t1.start()
    t2.start()
    # 線程對(duì)象調(diào)用join方法,會(huì)導(dǎo)致join后的代碼會(huì)在線程中的任務(wù)結(jié)束后才執(zhí)行
    t1.join()
    t2.join()
    print('電影下載結(jié)束!')


def main():
    # t1 = DownloadImageThread('https://image.haha.mx/2015/12/04/middle/2082175_c5c3cc05eb73e4023149e663475d3ab4_1449192201.gif')
    # t1.start()
    #
    # t2 = DownloadImageThread('http://img4.imgtn.bdimg.com/it/u=534897622,845095650&fm=26&gp=0.jpg')
    # t2.start()

    t0 = Thread(target=creat_thread)
    t0.start()

    print('========')
    for x in range(100):
        time.sleep(1)
        print(x)


if __name__ == '__main__':
    main()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 進(jìn)程和線程 進(jìn)程 所有運(yùn)行中的任務(wù)通常對(duì)應(yīng)一個(gè)進(jìn)程,當(dāng)一個(gè)程序進(jìn)入內(nèi)存運(yùn)行時(shí),即變成一個(gè)進(jìn)程.進(jìn)程是處于運(yùn)行過(guò)程中...
    勝浩_ae28閱讀 5,257評(píng)論 0 23
  • 進(jìn)程和線程 進(jìn)程 所有運(yùn)行中的任務(wù)通常對(duì)應(yīng)一個(gè)進(jìn)程,當(dāng)一個(gè)程序進(jìn)入內(nèi)存運(yùn)行時(shí),即變成一個(gè)進(jìn)程.進(jìn)程是處于運(yùn)行過(guò)程中...
    小徐andorid閱讀 2,989評(píng)論 3 53
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,644評(píng)論 1 32
  • ??一個(gè)任務(wù)通常就是一個(gè)程序,每個(gè)運(yùn)行中的程序就是一個(gè)進(jìn)程。當(dāng)一個(gè)程序運(yùn)行時(shí),內(nèi)部可能包含了多個(gè)順序執(zhí)行流,每個(gè)順...
    OmaiMoon閱讀 1,804評(píng)論 0 12
  • 從狹義到寬廣是自我認(rèn)知上的,如何養(yǎng)成一個(gè)好的習(xí)慣,也是《瑜伽經(jīng)》里講的戰(zhàn)勝“小我”!一個(gè)好習(xí)慣的養(yǎng)成,開(kāi)始都是從痛...
    李安娜126閱讀 270評(píng)論 0 0

友情鏈接更多精彩內(nèi)容