Python基礎(chǔ)學(xué)習(xí)9

多線程編程知識(shí)點(diǎn)記錄:
1袖订、單線程函數(shù)如何轉(zhuǎn)換為多線程
1)線程函數(shù)調(diào)用

import  threading
import  time
from threading import current_thread

def myThread(arg1, arg2):
    print(current_thread().getName(),'start')
    print('%s %s'%(arg1, arg2))
    time.sleep(1)
    print(current_thread().getName(),'stop')

for i in range(1,6,1):
    # t1 = myThread(i, i+1)
    t1 = threading.Thread(target=myThread,args=(i, i+1))#多線程分配
    t1.start()

print(current_thread().getName(),'end')

2)線程類調(diào)用

import  threading
from threading import  current_thread

class Mythread(threading.Thread):
    def run(self):
        print(current_thread().getName(),'start')
        print('run')
        print(current_thread().getName(),'stop')

for i in range(1,6,1):
    t1 = Mythread()
    t1.start()
    t1.join()

print(current_thread().getName(),'end')

問(wèn)題解答1:老師,我想不明白你重寫(xiě)這個(gè)run方法之后為什么這個(gè)線程還能夠執(zhí)行赋铝,之前是start函數(shù)調(diào)用原來(lái)這個(gè)run方法,你現(xiàn)在將它重寫(xiě)啦,重寫(xiě)不是覆蓋前面父類的方法嗎疫诽,您重寫(xiě)的run方法只是打印而已,怎么會(huì)執(zhí)行呢笼恰?
答:Thread是threading模塊的一個(gè)用于創(chuàng)建線程的類踊沸,創(chuàng)建線程有兩個(gè)方法,一個(gè)是通過(guò)繼承Thread類社证,重寫(xiě)run方法逼龟;我在視頻中演示的Mythread類就是這種方法了,要注意覆蓋的是父類繼承過(guò)來(lái)的run方法追葡,start還是繼承過(guò)來(lái)不變的腺律。這里要注意的是start()和run() 是Thread的兩種不同方法,官方定義在這里:https://docs.python.org/3.7/library/threading.html那么把他們的解釋翻譯成中文就是 start() 開(kāi)始線程工作宜肉,把run()方法放到一個(gè)另外的單獨(dú)的線程里執(zhí)行 匀钧;run() 線程工作方法,在“當(dāng)成”線程執(zhí)行函數(shù)里面的代碼谬返。所以他們的作用一個(gè)是開(kāi)啟新線程之斯,一個(gè)是按照線程的方式執(zhí)行程序。我們可以寫(xiě)個(gè)小程序來(lái)驗(yàn)證一下:
import threading
from threading import current_thread

class Mythread(threading.Thread):
def run(self):
print(current_thread().getName())

t1 = Mythread()
t1.run()
t1.start()
這段程序的執(zhí)行結(jié)果是:
MainThread
Thread-1
也就是說(shuō)單獨(dú)運(yùn)行run()方法遣铝,會(huì)把主進(jìn)程當(dāng)做一個(gè)線程來(lái)看佑刷,執(zhí)行的代碼空間在MainThread主線程中,執(zhí)行了start()方法酿炸,python會(huì)新創(chuàng)建一個(gè)線程瘫絮,叫Thread-1,然后再去調(diào)用run()來(lái)運(yùn)行填硕,這就是他們兩個(gè)的區(qū)別了麦萤。
問(wèn)題解答2:多線程不能無(wú)限多吧鹿鳖,應(yīng)該是看計(jì)算機(jī)的硬件性能。那么如何確定可以使用的最多線程壮莹?
答:最多線程由兩方面決定:內(nèi)存容量和軟件限制翅帜。雖然線程是輕量級(jí)進(jìn)程,但是創(chuàng)建線程也是要消耗內(nèi)存的垛孔,初始狀態(tài)下消耗大小就是內(nèi)存棧了藕甩,每創(chuàng)建一個(gè)線程為其分配一個(gè)線程棧,還有一種限制是系統(tǒng)的配置參數(shù)限制周荐,比如在linux上 每進(jìn)程默認(rèn)創(chuàng)建線程是1024個(gè)狭莱,在local_lim.h中定義,可以使用ulimt -a查看線程棧大小概作。
2腋妙、生產(chǎn)者和消費(fèi)者程序事例

from threading import Thread,current_thread
import time
import random
from queue import Queue

queue = Queue(5)

class ProducerThread(Thread):
    def run(self):
        name = current_thread().getName()
        nums = range(100)
        global queue
        while True:
            num = random.choice(nums)
            queue.put(num)
            print('生產(chǎn)者 %s 生產(chǎn)了數(shù)據(jù) %s' %(name, num))
            t = random.randint(1,3)
            time.sleep(t)
            print('生產(chǎn)者 %s 睡眠了 %s 秒' %(name, t))

class ConsumerTheard(Thread):
    def run(self):
        name = current_thread().getName()
        global queue
        while True:
            num = queue.get()
            queue.task_done()
            print('消費(fèi)者 %s 消耗了數(shù)據(jù) %s' %(name, num))
            t = random.randint(1,5)
            time.sleep(t)
            print('消費(fèi)者 %s 睡眠了 %s 秒' % (name, t))

p1 = ProducerThread(name = 'p1')
p1.start()
p2 = ProducerThread(name = 'p2')
p2.start()
p3 = ProducerThread(name = 'p3')
p3.start()
c1 = ConsumerTheard(name = 'c1')
c1.start()
c2 = ConsumerTheard(name = 'c2')
c2.start()

問(wèn)題解答:消費(fèi)者的task_done()還是不清楚用來(lái)干什么?
答:task_done()是配合join()使用的讯榕,join() 會(huì)讓隊(duì)列一直處于阻塞狀態(tài)骤素,直到queue里面所有的message都被get()取出來(lái)調(diào)用了task_done()才能返回,不用這個(gè)函數(shù)會(huì)讓join()出現(xiàn)無(wú)限掛起的問(wèn)題愚屁,不符合我們寫(xiě)程序的預(yù)期济竹。它和join()一起使用來(lái)判斷隊(duì)列里是否還有message需要處理的一種機(jī)制,如果看它的代碼實(shí)現(xiàn)霎槐,會(huì)發(fā)現(xiàn)它通過(guò)信號(hào)與join()進(jìn)行配合的送浊。
或許在初學(xué)階段,大家更容易理解這種用法
while not workQueue.empty():
pass
就是一直循環(huán)丘跌,直到隊(duì)列為空袭景。
兩種機(jī)制都可以判斷為隊(duì)列是否為空,看你需要那種方法和想要在哪種場(chǎng)景下使用闭树。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末耸棒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子报辱,更是在濱河造成了極大的恐慌与殃,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碍现,死亡現(xiàn)場(chǎng)離奇詭異幅疼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)鸵赫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門衣屏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)躏升,“玉大人辩棒,你說(shuō)我怎么就攤上這事。” “怎么了一睁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵钻弄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我者吁,道長(zhǎng)窘俺,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任复凳,我火速辦了婚禮瘤泪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘育八。我一直安慰自己对途,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布髓棋。 她就那樣靜靜地躺著实檀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪按声。 梳的紋絲不亂的頭發(fā)上膳犹,一...
    開(kāi)封第一講書(shū)人閱讀 51,775評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音签则,去河邊找鬼须床。 笑死,一個(gè)胖子當(dāng)著我的面吹牛怀愧,可吹牛的內(nèi)容都是我干的侨颈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼芯义,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼哈垢!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起扛拨,我...
    開(kāi)封第一講書(shū)人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤耘分,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后绑警,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體求泰,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年计盒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渴频。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡北启,死狀恐怖卜朗,靈堂內(nèi)的尸體忽然破棺而出拔第,到底是詐尸還是另有隱情,我是刑警寧澤场钉,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布蚊俺,位于F島的核電站,受9級(jí)特大地震影響逛万,放射性物質(zhì)發(fā)生泄漏泳猬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一宇植、第九天 我趴在偏房一處隱蔽的房頂上張望得封。 院中可真熱鬧,春花似錦指郁、人聲如沸呛每。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)晨横。三九已至,卻和暖如春箫柳,著一層夾襖步出監(jiān)牢的瞬間手形,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工悯恍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留库糠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓涮毫,卻偏偏與公主長(zhǎng)得像瞬欧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子罢防,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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

  • 一文讀懂Python多線程 1艘虎、線程和進(jìn)程 計(jì)算機(jī)的核心是CPU,它承擔(dān)了所有的計(jì)算任務(wù)咒吐。它就像一座工廠野建,時(shí)刻在運(yùn)...
    星丶雲(yún)閱讀 1,455評(píng)論 0 4
  • 進(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,113評(píng)論 0 23
  • 一、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 5,746評(píng)論 0 10
  • 寫(xiě)在前面的話 代碼中的# > 表示的是輸出結(jié)果 輸入 使用input()函數(shù) 用法 注意input函數(shù)輸出的均是字...
    FlyingLittlePG閱讀 2,764評(píng)論 0 8
  • 多任務(wù)-線程恬叹、多線程執(zhí)行候生、線程注意點(diǎn)、自定義線程绽昼、多線程-共享全局變量唯鸭、互斥鎖、死鎖 1. 多任務(wù)-線程 <1>多...
    Cestine閱讀 641評(píng)論 0 7