成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

Python中過(guò)程threading.Thread的應(yīng)用詳細(xì)說(shuō)明

89542767 / 591人閱讀

  1.過(guò)程這個(gè)概念


  過(guò)程,有時(shí)候被稱(chēng)作輕量級(jí)進(jìn)程(LightweightProcess,LWP),是程序執(zhí)行流的最低控制模塊。統(tǒng)一標(biāo)準(zhǔn)的過(guò)程由過(guò)程ID,現(xiàn)階段命令表針(PC),存儲(chǔ)器結(jié)合和局部變量構(gòu)成。此外,過(guò)程是過(guò)程里的一個(gè)實(shí)體線(xiàn),被系統(tǒng)軟件多帶帶生產(chǎn)調(diào)度和分配的基本要素,過(guò)程自己并不有著服務(wù)器資源。


  2.threading.thread()簡(jiǎn)單地應(yīng)用


  2.1加上過(guò)程能是程序執(zhí)行迅速


  pythod的thread模塊還是比較最底層的控制模塊,pythod的threading模塊是對(duì)thread做了很多包裝,能夠方便快捷被應(yīng)用。


  有一點(diǎn)在運(yùn)行時(shí)不可缺少的網(wǎng)絡(luò)資源,但是它能與同為1個(gè)進(jìn)度的其他線(xiàn)程共享過(guò)程所具有的所有網(wǎng)絡(luò)資源。


  import threading
  import time
  def saySorry():
  print("親愛(ài)的,我錯(cuò)了,我能吃飯了嗎?")
  time.sleep(5)
  if __name__=="__main__":
  start_time1=time.time()
  for i in range(5):
  t=threading.Thread(target=saySorry)
  t.start()#啟動(dòng)線(xiàn)程,即讓線(xiàn)程開(kāi)始執(zhí)行
  end_time1=time.time()
  print(end_time1-start_time1)
  start_time2=time.time()
  for i in range(5):
  t=saySorry()
  end_time2=time.time()
  print(end_time2-start_time2)


  輸出為:


  親愛(ài)的,我錯(cuò)了,我能吃飯了嗎?


  親愛(ài)的,我錯(cuò)了,我能吃飯了嗎?


  親愛(ài)的,我錯(cuò)了,我能吃飯了嗎?


  親愛(ài)的,我錯(cuò)了,我能吃飯了嗎?


  親愛(ài)的,我錯(cuò)了,我能吃飯了嗎?


  0.001995086669921875


  親愛(ài)的,我錯(cuò)了,我能吃飯了嗎?


  親愛(ài)的,我錯(cuò)了,我能吃飯了嗎?


  親愛(ài)的,我錯(cuò)了,我能吃飯了嗎?


  親愛(ài)的,我錯(cuò)了,我能吃飯了嗎?


  親愛(ài)的,我錯(cuò)了,我能吃飯了嗎?


  25.001766204833984


  2.2主線(xiàn)程會(huì)等待所有的子線(xiàn)程結(jié)束后才結(jié)束


  import threading
  from time import sleep,ctime
  def sing():
  for i in range(3):
  print("正在唱歌...%d"%i)
  sleep(1)
  def dance():
  for i in range(3):
  print("正在跳舞...%d"%i)
  sleep(1)
  if __name__=='__main__':
  print('---開(kāi)始---:%s'%ctime())
  t1=threading.Thread(target=sing)
  t2=threading.Thread(target=dance)
  t1.start()
  t2.start()
  #sleep(5)#屏蔽此行代碼,試試看,程序是否會(huì)立馬結(jié)束?
  print('---結(jié)束---:%s'%ctime())


  輸出為:


  ---開(kāi)始---:Mon Sep 28 14:42:09 2020


  正在唱歌...0


  正在跳舞...0---結(jié)束---:Mon Sep 28 14:42:09 2020


  正在唱歌...1


  正在跳舞...1


  正在唱歌...2


  正在跳舞...2


  如果釋放‘sleep(5)’,輸出為:


  ---開(kāi)始---:Mon Sep 28 14:43:36 2020


  正在唱歌...0


  正在跳舞...0


  正在跳舞...1


  正在唱歌...1


  正在唱歌...2正在跳舞...2


  ---結(jié)束---:Mon Sep 28 14:43:41 2020


  3.查看線(xiàn)程數(shù)量


  import threading
  from time import sleep,ctime
  def sing():
  for i in range(3):
  print("正在唱歌...%d"%i)
  sleep(1)
  def dance():
  for i in range(3):
  print("正在跳舞...%d"%i)
  sleep(1)
  if __name__=='__main__':
  print('---開(kāi)始---:%s'%ctime())
  t1=threading.Thread(target=sing)
  t2=threading.Thread(target=dance)
  t1.start()
  t2.start()
  while True:
  length=len(threading.enumerate())
  print('當(dāng)前運(yùn)行的線(xiàn)程數(shù)為:%d'%length)
  if length<=1:
  break
  sleep(0.5)


  輸出為:


  ---開(kāi)始---:Mon Sep 28 14:46:16 2020


  正在唱歌...0


  正在跳舞...0


  當(dāng)前運(yùn)行的線(xiàn)程數(shù)為:3


  當(dāng)前運(yùn)行的線(xiàn)程數(shù)為:3


  正在唱歌...1


  正在跳舞...1當(dāng)前運(yùn)行的線(xiàn)程數(shù)為:3


  當(dāng)前運(yùn)行的線(xiàn)程數(shù)為:3


  正在唱歌...2


  正在跳舞...2


  當(dāng)前運(yùn)行的線(xiàn)程數(shù)為:3


  當(dāng)前運(yùn)行的線(xiàn)程數(shù)為:3


  當(dāng)前運(yùn)行的線(xiàn)程數(shù)為:1


  4.線(xiàn)程參數(shù)及順序


  4.1傳遞參數(shù)的方法


  使用args傳遞參數(shù)threading.Thread(target=sing,args=(10,100,100))


  使用kwargs傳遞參數(shù)threading.Thread(target=sing,kwargs={“a”:10,“b”:100,“c”:100})


  同時(shí)使用args和kwargs傳遞參數(shù)threading.Thread(target=sing,args=(10,),kwargs={“b”:100,“c”:100})


  4.2線(xiàn)程的執(zhí)行順序


  import threading
  import time
  def sing():
  for i in range(5):
  print("我是sing")
  time.sleep(1)
  def dance():
  for i in range(5):
  print("我是dance")
  time.sleep(1)
  if __name__=='__main__':
  #創(chuàng)建兩個(gè)子線(xiàn)程
  t1=threading.Thread(target=sing)
  t2=threading.Thread(target=dance)
  #啟動(dòng)子線(xiàn)程
  t1.start()
  t2.start()


  輸出為:


  我是sing


  我是dance


  我是sing


  我是dance


  我是dance


  我是sing


  我是dance我是sing


  我是sing


  我是dance


  說(shuō)明:


  從代碼和執(zhí)行結(jié)果我們可以看出,多線(xiàn)程程序的執(zhí)行順序是不確定的。當(dāng)執(zhí)行到sleep語(yǔ)句時(shí),線(xiàn)程將被阻塞(Blocked),到sleep結(jié)束后,線(xiàn)程進(jìn)入就緒(Runnable)狀態(tài),等待調(diào)度。而線(xiàn)程調(diào)度將自行選擇一個(gè)線(xiàn)程執(zhí)行。上面的代碼中只能保證每個(gè)線(xiàn)程都運(yùn)行完整個(gè)run函數(shù),但是線(xiàn)程的啟動(dòng)順序、run函數(shù)中每次循環(huán)的執(zhí)行順序都不能確定。


  5.守護(hù)線(xiàn)程


  守護(hù)線(xiàn)程:如果在程序中將子線(xiàn)程設(shè)置為守護(hù)線(xiàn)程,則該子線(xiàn)程會(huì)在主線(xiàn)程結(jié)束時(shí)自動(dòng)退出,設(shè)置方式為thread.setDaemon(True),要在thread.start()之前設(shè)置,默認(rèn)是false的,也就是主線(xiàn)程結(jié)束時(shí),子線(xiàn)程依然在執(zhí)行。


  5.1如下代碼,主線(xiàn)程已經(jīng)exit()【其實(shí)并沒(méi)有真正結(jié)束】,子線(xiàn)程還在繼續(xù)執(zhí)行


  import threading
  import time
  def test():
  for i in range(7):
  print("test is run:",i)
  time.sleep(1)
  if __name__=='__main__':
  #創(chuàng)建子線(xiàn)程
  t1=threading.Thread(target=test)
  #啟動(dòng)子線(xiàn)程
  t1.start()
  #休眠2秒
  time.sleep(2)
  print("我OVER了")
  #退出
  exit()


  輸出為:


  test is run:0


  test is run:1


  我OVER了


  test is run:2


  test is run:3


  test is run:4


  test is run:5


  test is run:6


  5.2設(shè)置守護(hù)線(xiàn)程


  為線(xiàn)程設(shè)置守護(hù),如果主線(xiàn)程結(jié)束,子線(xiàn)程也隨之結(jié)束。


  import threading
  import time
  def test():
  for i in range(7):
  print("test is run:",i)
  time.sleep(1)
  if __name__=='__main__':
  #創(chuàng)建子線(xiàn)程
  t1=threading.Thread(target=test)
  #設(shè)置線(xiàn)程保護(hù)
  t1.setDaemon(True)
  #啟動(dòng)子線(xiàn)程
  t1.start()
  #休眠2秒
  time.sleep(2)
  print("我OVER了")
  #退出
  exit()
  輸出為:
  test is run:0
  test is run:1
  我OVER了
  參考代碼
  import threading
  from threading import Lock,Thread
  import time,os
  '''


  python多線(xiàn)程詳解


  什么是線(xiàn)程?


  線(xiàn)程也叫輕量級(jí)進(jìn)程,是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位,它被包涵在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。


  線(xiàn)程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)兒在運(yùn)行中必不可少的資源,但它可與同屬一個(gè)進(jìn)程的其他線(xiàn)程共享進(jìn)程所


  擁有的全部資源。一個(gè)線(xiàn)程可以創(chuàng)建和撤銷(xiāo)另一個(gè)線(xiàn)程,同一個(gè)進(jìn)程中的多個(gè)線(xiàn)程之間可以并發(fā)執(zhí)行


  '''


  '''


  為什么要使用多線(xiàn)程?


  線(xiàn)程在程序中是獨(dú)立的、并發(fā)的執(zhí)行流。與分隔的進(jìn)程相比,進(jìn)程中線(xiàn)程之間的隔離程度要小,它們共享內(nèi)存、文件句柄


  和其他進(jìn)程應(yīng)有的狀態(tài)。


  因?yàn)榫€(xiàn)程的劃分尺度小于進(jìn)程,使得多線(xiàn)程程序的并發(fā)性高。進(jìn)程在執(zhí)行過(guò)程之中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線(xiàn)程共享


  內(nèi)存,從而極大的提升了程序的運(yùn)行效率。


  線(xiàn)程比進(jìn)程具有更高的性能,這是由于同一個(gè)進(jìn)程中的線(xiàn)程都有共性,多個(gè)線(xiàn)程共享一個(gè)進(jìn)程的虛擬空間。線(xiàn)程的共享環(huán)境


  包括進(jìn)程代碼段、進(jìn)程的共有數(shù)據(jù)等,利用這些共享的數(shù)據(jù),線(xiàn)程之間很容易實(shí)現(xiàn)通信。


  操作系統(tǒng)在創(chuàng)建進(jìn)程時(shí),必須為改進(jìn)程分配獨(dú)立的內(nèi)存空間,并分配大量的相關(guān)資源,但創(chuàng)建線(xiàn)程則簡(jiǎn)單得多。因此,使用多線(xiàn)程


  來(lái)實(shí)現(xiàn)并發(fā)比使用多進(jìn)程的性能高得要多。


  '''


  '''


  總結(jié)起來(lái),使用多線(xiàn)程編程具有如下幾個(gè)優(yōu)點(diǎn):


  進(jìn)程之間不能共享內(nèi)存,但線(xiàn)程之間共享內(nèi)存非常容易。


  操作系統(tǒng)在創(chuàng)建進(jìn)程時(shí),需要為該進(jìn)程重新分配系統(tǒng)資源,但創(chuàng)建線(xiàn)程的代價(jià)則小得多。因此使用多線(xiàn)程來(lái)實(shí)現(xiàn)多任務(wù)并發(fā)執(zhí)行比使用多進(jìn)程的效率高


  python語(yǔ)言?xún)?nèi)置了多線(xiàn)程功能支持,而不是單純地作為底層操作系統(tǒng)的調(diào)度方式,從而簡(jiǎn)化了python的多線(xiàn)程編程。


  '''
  '''
  普通創(chuàng)建方式
  '''
  #def run(n):
  #print('task',n)
  #time.sleep(1)
  #print('2s')
  #time.sleep(1)
  #print('1s')
  #time.sleep(1)
  #print('0s')
  #time.sleep(1)
  #
  #if __name__=='__main__':
  #t1=threading.Thread(target=run,args=('t1',))#target是要執(zhí)行的函數(shù)名(不是函數(shù)),args是函數(shù)對(duì)應(yīng)的參數(shù),以元組的形式存在
  #t2=threading.Thread(target=run,args=('t2',))
  #t1.start()
  #t2.start()
  '''
  自定義線(xiàn)程:繼承threading.Thread來(lái)定義線(xiàn)程類(lèi),其本質(zhì)是重構(gòu)Thread類(lèi)中的run方法
  '''
  #class MyThread(threading.Thread):
  #def __init__(self,n):
  #super(MyThread,self).__init__()#重構(gòu)run函數(shù)必須寫(xiě)
  #self.n=n
  #
  #def run(self):
  #print('task',self.n)
  #time.sleep(1)
  #print('2s')
  #time.sleep(1)
  #print('1s')
  #time.sleep(1)
  #print('0s')
  #time.sleep(1)
  #
  #if __name__=='__main__':
  #t1=MyThread('t1')
  #t2=MyThread('t2')
  #t1.start()
  #t2.start()
  '''


  守護(hù)線(xiàn)程


  下面這個(gè)例子,這里使用setDaemon(True)把所有的子線(xiàn)程都變成了主線(xiàn)程的守護(hù)線(xiàn)程,


  因此當(dāng)主線(xiàn)程結(jié)束后,子線(xiàn)程也會(huì)隨之結(jié)束,所以當(dāng)主線(xiàn)程結(jié)束后,整個(gè)程序就退出了。


  所謂'線(xiàn)程守護(hù)',就是主線(xiàn)程不管該線(xiàn)程的執(zhí)行情況,只要是其他子線(xiàn)程結(jié)束且主線(xiàn)程執(zhí)行完畢,主線(xiàn)程都會(huì)關(guān)閉。也就是說(shuō):主線(xiàn)程不等待該守護(hù)線(xiàn)程的執(zhí)行完再去關(guān)閉。


  '''
  #def run(n):
  #print('task',n)
  #time.sleep(1)
  #print('3s')
  #time.sleep(1)
  #print('2s')
  #time.sleep(1)
  #print('1s')
  #
  #if __name__=='__main__':
  #t=threading.Thread(target=run,args=('t1',))
  #t.setDaemon(True)
  #t.start()
  #print('end')
  '''
  通過(guò)執(zhí)行結(jié)果可以看出,設(shè)置守護(hù)線(xiàn)程之后,當(dāng)主線(xiàn)程結(jié)束時(shí),子線(xiàn)程也將立即結(jié)束,不再執(zhí)行
  '''
  '''
  主線(xiàn)程等待子線(xiàn)程結(jié)束
  為了讓守護(hù)線(xiàn)程執(zhí)行結(jié)束之后,主線(xiàn)程再結(jié)束,我們可以使用join方法,讓主線(xiàn)程等待子線(xiàn)程執(zhí)行
  '''
  #def run(n):
  #print('task',n)
  #time.sleep(2)
  #print('5s')
  #time.sleep(2)
  #print('3s')
  #time.sleep(2)
  #print('1s')
  #if __name__=='__main__':
  #t=threading.Thread(target=run,args=('t1',))
  #t.setDaemon(True)#把子線(xiàn)程設(shè)置為守護(hù)線(xiàn)程,必須在start()之前設(shè)置
  #t.start()
  #t.join()#設(shè)置主線(xiàn)程等待子線(xiàn)程結(jié)束
  #print('end')
  '''
  多線(xiàn)程共享全局變量
  線(xiàn)程時(shí)進(jìn)程的執(zhí)行單元,進(jìn)程時(shí)系統(tǒng)分配資源的最小執(zhí)行單位,所以在同一個(gè)進(jìn)程中的多線(xiàn)程是共享資源的
  '''
  #g_num=100
  #def work1():
  #global g_num
  #for i in range(3):
  #g_num+=1
  #print('in work1 g_num is:%d'%g_num)
  #
  #def work2():
  #global g_num
  #print('in work2 g_num is:%d'%g_num)
  #
  #if __name__=='__main__':
  #t1=threading.Thread(target=work1)
  #t1.start()
  #time.sleep(1)
  #t2=threading.Thread(target=work2)
  #t2.start()
  '''
  由于線(xiàn)程之間是進(jìn)行隨機(jī)調(diào)度,并且每個(gè)線(xiàn)程可能只執(zhí)行n條執(zhí)行之后,當(dāng)多個(gè)線(xiàn)程同時(shí)修改同一條數(shù)據(jù)時(shí)可能會(huì)出現(xiàn)臟數(shù)據(jù),
  所以出現(xiàn)了線(xiàn)程鎖,即同一時(shí)刻允許一個(gè)線(xiàn)程執(zhí)行操作。線(xiàn)程鎖用于鎖定資源,可以定義多個(gè)鎖,像下面的代碼,當(dāng)需要獨(dú)占
  某一個(gè)資源時(shí),任何一個(gè)鎖都可以鎖定這個(gè)資源,就好比你用不同的鎖都可以把這個(gè)相同的門(mén)鎖住一樣。
  由于線(xiàn)程之間是進(jìn)行隨機(jī)調(diào)度的,如果有多個(gè)線(xiàn)程同時(shí)操作一個(gè)對(duì)象,如果沒(méi)有很好地保護(hù)該對(duì)象,會(huì)造成程序結(jié)果的不可預(yù)期,
  我們因此也稱(chēng)為“線(xiàn)程不安全”。
  為了防止上面情況的發(fā)生,就出現(xiàn)了互斥鎖(Lock)
  '''
  #def work():
  #global n
  #lock.acquire()
  #temp=n
  #time.sleep(0.1)
  #n=temp-1
  #lock.release()
  #
  #
  #if __name__=='__main__':
  #lock=Lock()
  #n=100
  #l=[]
  #for i in range(100):
  #p=Thread(target=work)
  #l.append(p)
  #p.start()
  #for p in l:
  #p.join()
  '''
  遞歸鎖:RLcok類(lèi)的用法和Lock類(lèi)一模一樣,但它支持嵌套,在多個(gè)鎖沒(méi)有釋放的時(shí)候一般會(huì)使用RLock類(lèi)
  '''
  #def func(lock):
  #global gl_num
  #lock.acquire()
  #gl_num+=1
  #time.sleep(1)
  #print(gl_num)
  #lock.release()
  #
  #
  #if __name__=='__main__':
  #gl_num=0
  #lock=threading.RLock()
  #for i in range(10):
  #t=threading.Thread(target=func,args=(lock,))
  #t.start()
  '''
  信號(hào)量(BoundedSemaphore類(lèi))
  互斥鎖同時(shí)只允許一個(gè)線(xiàn)程更改數(shù)據(jù),而Semaphore是同時(shí)允許一定數(shù)量的線(xiàn)程更改數(shù)據(jù),比如廁所有3個(gè)坑,
  那最多只允許3個(gè)人上廁所,后面的人只能等里面有人出來(lái)了才能再進(jìn)去
  '''
  #def run(n,semaphore):
  #semaphore.acquire()#加鎖
  #time.sleep(3)
  #print('run the thread:%sn'%n)
  #semaphore.release()#釋放
  #
  #
  #if __name__=='__main__':
  #num=0
  #semaphore=threading.BoundedSemaphore(5)#最多允許5個(gè)線(xiàn)程同時(shí)運(yùn)行
  #for i in range(22):
  #t=threading.Thread(target=run,args=('t-%s'%i,semaphore))
  #t.start()
  #while threading.active_count()!=1:
  #pass
  #else:
  #print('----------all threads done-----------')
  '''
  python線(xiàn)程的事件用于主線(xiàn)程控制其他線(xiàn)程的執(zhí)行,事件是一個(gè)簡(jiǎn)單的線(xiàn)程同步對(duì)象,其主要提供以下的幾個(gè)方法:
  clear將flag設(shè)置為False
  set將flag設(shè)置為T(mén)rue
  is_set判斷是否設(shè)置了flag
  wait會(huì)一直監(jiān)聽(tīng)flag,如果沒(méi)有檢測(cè)到flag就一直處于阻塞狀態(tài)
  事件處理的機(jī)制:全局定義了一個(gè)Flag,當(dāng)Flag的值為False,那么event.wait()就會(huì)阻塞,當(dāng)flag值為T(mén)rue,
  那么event.wait()便不再阻塞
  '''
  event=threading.Event()
  def lighter():
  count=0
  event.set()#初始者為綠燈
  while True:
  if 5<count<=10:
  event.clear()#紅燈,清除標(biāo)志位
  print("33[41;lmred light is on...33[0m]")
  elif count>10:
  event.set()#綠燈,設(shè)置標(biāo)志位
  count=0
  else:
  print('33[42;lmgreen light is on...33[0m')
  time.sleep(1)
  count+=1
  def car(name):
  while True:
  if event.is_set():#判斷是否設(shè)置了標(biāo)志位
  print('[%s]running.....'%name)
  time.sleep(1)
  else:
  print('[%s]sees red light,waiting...'%name)
  event.wait()
  print('[%s]green light is on,start going...'%name)
  #startTime=time.time()
  light=threading.Thread(target=lighter,)
  light.start()
  car=threading.Thread(target=car,args=('MINT',))
  car.start()
  endTime=time.time()
  #print('用時(shí):',endTime-startTime)
  '''


  GIL全局解釋器


  在非python環(huán)境中,單核情況下,同時(shí)只能有一個(gè)任務(wù)執(zhí)行。多核時(shí)可以支持多個(gè)線(xiàn)程同時(shí)執(zhí)行。但是在python中,無(wú)論有多少個(gè)核


  同時(shí)只能執(zhí)行一個(gè)線(xiàn)程。究其原因,這就是由于GIL的存在導(dǎo)致的。


  GIL的全程是全局解釋器,來(lái)源是python設(shè)計(jì)之初的考慮,為了數(shù)據(jù)安全所做的決定。某個(gè)線(xiàn)程想要執(zhí)行,必須先拿到GIL,我們可以


  把GIL看做是“通行證”,并且在一個(gè)python進(jìn)程之中,GIL只有一個(gè)。拿不到線(xiàn)程的通行證,并且在一個(gè)python進(jìn)程中,GIL只有一個(gè),


  拿不到通行證的線(xiàn)程,就不允許進(jìn)入CPU執(zhí)行。GIL只在cpython中才有,因?yàn)閏python調(diào)用的是c語(yǔ)言的原生線(xiàn)程,所以他不能直接操


  作cpu,而只能利用GIL保證同一時(shí)間只能有一個(gè)線(xiàn)程拿到數(shù)據(jù)。而在pypy和jpython中是沒(méi)有GIL的


  python在使用多線(xiàn)程的時(shí)候,調(diào)用的是c語(yǔ)言的原生過(guò)程。


  '''


  '''


  python針對(duì)不同類(lèi)型的代碼執(zhí)行效率也是不同的


  1、CPU密集型代碼(各種循環(huán)處理、計(jì)算等),在這種情況下,由于計(jì)算工作多,ticks技術(shù)很快就會(huì)達(dá)到閥值,然后出發(fā)GIL的


  釋放與再競(jìng)爭(zhēng)(多個(gè)線(xiàn)程來(lái)回切換當(dāng)然是需要消耗資源的),所以python下的多線(xiàn)程對(duì)CPU密集型代碼并不友好。


  2、IO密集型代碼(文件處理、網(wǎng)絡(luò)爬蟲(chóng)等設(shè)計(jì)文件讀寫(xiě)操作),多線(xiàn)程能夠有效提升效率(單線(xiàn)程下有IO操作會(huì)進(jìn)行IO等待,


  造成不必要的時(shí)間浪費(fèi),而開(kāi)啟多線(xiàn)程能在線(xiàn)程A等待時(shí),自動(dòng)切換到線(xiàn)程B,可以不浪費(fèi)CPU的資源,從而能提升程序的執(zhí)行


  效率)。所以python的多線(xiàn)程對(duì)IO密集型代碼比較友好。


  '''


  '''


  主要要看任務(wù)的類(lèi)型,我們把任務(wù)分為I/O密集型和計(jì)算密集型,而多線(xiàn)程在切換中又分為I/O切換和時(shí)間切換。如果任務(wù)屬于是I/O密集型,


  若不采用多線(xiàn)程,我們?cè)谶M(jìn)行I/O操作時(shí),勢(shì)必要等待前面一個(gè)I/O任務(wù)完成后面的I/O任務(wù)才能進(jìn)行,在這個(gè)等待的過(guò)程中,CPU處于等待


  狀態(tài),這時(shí)如果采用多線(xiàn)程的話(huà),剛好可以切換到進(jìn)行另一個(gè)I/O任務(wù)。這樣就剛好可以充分利用CPU避免CPU處于閑置狀態(tài),提高效率。但是


  如果多線(xiàn)程任務(wù)都是計(jì)算型,CPU會(huì)一直在進(jìn)行工作,直到一定的時(shí)間后采取多線(xiàn)程時(shí)間切換的方式進(jìn)行切換線(xiàn)程,此時(shí)CPU一直處于工作狀態(tài),


  此種情況下并不能提高性能,相反在切換多線(xiàn)程任務(wù)時(shí),可能還會(huì)造成時(shí)間和資源的浪費(fèi),導(dǎo)致效能下降。這就是造成上面兩種多線(xiàn)程結(jié)果不能的解釋。


  結(jié)論:I/O密集型任務(wù),建議采取多線(xiàn)程,還可以采用多進(jìn)程+協(xié)程的方式(例如:爬蟲(chóng)多采用多線(xiàn)程處理爬取的數(shù)據(jù));對(duì)于計(jì)算密集型任務(wù),python此時(shí)就不適用了。


  '''


  綜上所述,這篇文章就給大家介紹到這里了,希望可以給大家?guī)?lái)幫助。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/128697.html

相關(guān)文章

  • Python迅速?gòu)亩桃曨l獲取視頻幀辦法詳細(xì)說(shuō)明

      本文給大家介紹一類(lèi)從視頻里獲取視頻幀的辦法,因?yàn)閱魏双@取視頻幀速率比較慢,因而接下來(lái)我們?cè)鰪?qiáng)了線(xiàn)程同步的辦法,感興趣的朋友能夠出手試一試  Python迅速獲取視頻幀(線(xiàn)程同步)  現(xiàn)在詳細(xì)介紹一下一類(lèi)從視頻里獲取視頻幀的辦法,因?yàn)閱魏双@取視頻幀速率比較慢,因而接下來(lái)我們?cè)鰪?qiáng)了線(xiàn)程同步的辦法?! ?、獲取視頻幀  獲取視頻幀關(guān)鍵用了Opencv控制模塊。  在其中:  camera=cv2.V...

    89542767 評(píng)論0 收藏0
  • PyTips 0x 12 - Python 線(xiàn)程與協(xié)程(1)

    摘要:中關(guān)于線(xiàn)程的標(biāo)準(zhǔn)庫(kù)是,之前在版本中的在之后更名為,無(wú)論是還是都應(yīng)該盡量避免使用較為底層的而應(yīng)該使用。而與線(xiàn)程相比,協(xié)程尤其是結(jié)合事件循環(huán)無(wú)論在編程模型還是語(yǔ)法上,看起來(lái)都是非常友好的單線(xiàn)程同步過(guò)程。 項(xiàng)目地址:https://git.io/pytips 要說(shuō)到線(xiàn)程(Thread)與協(xié)程(Coroutine)似乎總是需要從并行(Parallelism)與并發(fā)(Concurrency)談起...

    el09xccxy 評(píng)論0 收藏0
  • 淺談Python多線(xiàn)程

    摘要:進(jìn)程可創(chuàng)建多個(gè)線(xiàn)程來(lái)執(zhí)行同一程序的不同部分。就緒等待線(xiàn)程調(diào)度。運(yùn)行線(xiàn)程正常運(yùn)行阻塞暫停運(yùn)行,解除阻塞后進(jìn)入狀態(tài)重新等待調(diào)度。消亡線(xiàn)程方法執(zhí)行完畢返回或者異常終止。多線(xiàn)程多的情況下,依次執(zhí)行各線(xiàn)程的方法,前頭一個(gè)結(jié)束了才能執(zhí)行后面一個(gè)。 淺談Python多線(xiàn)程 作者簡(jiǎn)介: 姓名:黃志成(小黃)博客: 博客 線(xiàn)程 一.什么是線(xiàn)程? 操作系統(tǒng)原理相關(guān)的書(shū),基本都會(huì)提到一句很經(jīng)典的話(huà): 進(jìn)程...

    zsirfs 評(píng)論0 收藏0
  • Python多線(xiàn)程

    摘要:多線(xiàn)程的理解多進(jìn)程和多線(xiàn)程都可以執(zhí)行多個(gè)任務(wù),線(xiàn)程是進(jìn)程的一部分。多線(xiàn)程創(chuàng)建在中,同樣可以實(shí)現(xiàn)多線(xiàn)程,有兩個(gè)標(biāo)準(zhǔn)模塊和,不過(guò)我們主要使用更高級(jí)的模塊。多線(xiàn)程的應(yīng)用場(chǎng)景。 1、多線(xiàn)程的理解 多進(jìn)程和多線(xiàn)程都可以執(zhí)行多個(gè)任務(wù),線(xiàn)程是進(jìn)程的一部分。線(xiàn)程的特點(diǎn)是線(xiàn)程之間可以共享內(nèi)存和變量,資源消耗少(不過(guò)在Unix環(huán)境中,多進(jìn)程和多線(xiàn)程資源調(diào)度消耗差距不明顯,Unix調(diào)度較快),缺點(diǎn)是線(xiàn)程之間...

    dcr309duan 評(píng)論0 收藏0
  • # Python 多線(xiàn)程和鎖

    摘要:多線(xiàn)程和鎖作者博客進(jìn)程和線(xiàn)程進(jìn)程是執(zhí)行中的計(jì)算機(jī)程序。線(xiàn)程包括開(kāi)始執(zhí)行順序和結(jié)束三部分。的多進(jìn)程相關(guān)模塊模塊是高級(jí)別的多線(xiàn)程模塊。線(xiàn)程鎖當(dāng)多線(xiàn)程爭(zhēng)奪鎖時(shí),允許第一個(gè)獲得鎖的線(xiàn)程進(jìn)入臨街區(qū),并執(zhí)行代碼。 Python 多線(xiàn)程和鎖 作者博客:http://zzir.cn/ 進(jìn)程和線(xiàn)程 進(jìn)程是執(zhí)行中的計(jì)算機(jī)程序。每個(gè)進(jìn)程都擁有自己的地址空間、內(nèi)存、數(shù)據(jù)棧及其它的輔助數(shù)據(jù)。操作系統(tǒng)管理著所有的...

    cpupro 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<