python-進程、線程

來源:互聯網
上載者:User

標籤:mon   --   nbsp   strong   速度   用法   一件事   程式   nis   

一、解釋:

   相信百分之百的同學都會用到作業系統,別說不用,不用的話特麼你怎麼看的我的部落格,而我們的作業系統你可以一遍看著我寫的部落格,又一遍聽著音樂,說到音樂給大家推薦一首叫做"Shape of You",而我就是邊聽著音樂邊寫部落格,哈哈.....;那麼這裡我們就要想了,我們的電腦又是怎麼來運算的呢?怎麼同時開啟這麼多任務的呢?而且還有好多任務偷偷的在後台運行著呢,只是案頭上沒有顯示而已。

   而現在多核心多線程的電腦已經很普及,是的,這樣計算的並發可以更多更快,但是在電腦剛流行的時候,很多單核CPU又怎麼執行多任務的呢?畢竟CPU執行代碼都是按照順序執行的;而答案就是電腦上的作業系統輪流讓各個任務交替執行,任務A執行0.01秒,切換到任務B上執行0.01秒,再切換到任務3上,這樣反覆下去,表面上看每個任務都是交替執行的,但是,由於CPU的執行速度實在是太快了,我們感覺就像所有任務都在同時執行一樣。

  所以,我們在日常啟動並執行環境中,並存執行多任務只能在多核心多線程的CPU上實現,但是我們有的時候任務數量遠遠多於CPU的核心數量,所以,作業系統也會自動把很多任務輪流調度到每個核心上執行。 

   對於作業系統來說,一個任務就是一個進程(Process),比如開啟一個瀏覽器就是啟動一個瀏覽器進程,開啟一個記事本就啟動了一個記事本進程,開啟兩個記事本就啟動了兩個記事本進程,開啟一個Word就啟動了一個Word進程。

  有些進程還不止同時幹一件事,比如Word,它可以同時進行打字、拼字檢查、列印等事情。在一個進程內部,要同時幹多件事,就需要同時運行多個“子任務”,我們把進程內的這些“子任務”稱為線程(Thread)。
  由於每個進程至少要幹一件事,所以,一個進程至少有一個線程。當然,像Word這種複雜的進程可以有多個線程,多個線程可以同時執行,多線程的執行方式和多進程是一樣的,也是由作業系統在多個線程之間快速切換,讓每個線程都短暫地交替運行,看起來就像同時執行一樣。當然,真正地同時執行多線程需要多核CPU才可能實現。

  總結:

   應用程式--->進程--->線程  

   應用程式最少有一個進程,而一個進程最後有一個主線程,而一個程式可以啟多個進程,一個進程可以啟動多個線程,而它們都有自己的主進程和主線程,而進程和線程都是有CPU來運算,運算方式就是來回切換運算。

線程和進程Python與其它開發語言的不同,其它語言線程之間可以在多個CPU之間切換,而Python不支援多線程,只能多進程(前提是被CPU調用),所以出現了以下應用情境

 應用情境:

   IO密集型:多線程

   計算密集型:多進程

 GIL,全域解譯器鎖,保證同一個進程中只有一個線程同時被調用

二、線程的使用

  看代碼

 

import threading    #匯入線程的模組import timedef task(a):    #進程的函數    time.sleep(1)    #等待一秒    print(a)for i in range(30):   #同時啟動30個線程    t = threading.Thread(target=task,args=[i,])   #建立了進程,target表示要建立的進程    t.start()                #進程啟動,表示開始工作print("end")     #啟動主進程

 

setDaemon的用法

 說明:setDaemon 設定主進程是否等待子線程結束了,再結束自己,預設選項為(False)

 例子: (預設選項)

import threading    #匯入線程的模組import timedef task(a):    #進程的函數    time.sleep(1)    #等待一秒    print(a)for i in range(5):    t = threading.Thread(target=task,args=[i,])   #建立了進程,target表示要建立的進程    t.setDaemon(False)    #主進程是否等待子線程,False 是等待 True是不等待    t.start()                #進程啟動print("end")     #啟動主進程###輸出如下:C:\Python35\python.exe D:/linux/python/day-test/day9/test1.pyend02134

非預設選項(True)

import threading    #匯入線程的模組
import time
def task(a): #進程的函數
time.sleep(1) #等待一秒
print(a)
for i in range(5):
t = threading.Thread(target=task,args=[i,]) #建立了進程,target表示要建立的進程
t.setDaemon(True) #主進程是否等待子線程,False 是等待 True是不等待
t.start() #進程啟動
print("end") #啟動主進程

輸出如下:
import threading    #匯入線程的模組import timedef task(a):    #進程的函數    time.sleep(1)    #等待一秒    print(a)for i in range(5):    t = threading.Thread(target=task,args=[i,])   #建立了進程,target表示要建立的進程    t.setDaemon(True)    #主進程是否等待子線程,False 是等待 True是不等待    t.start()                #進程啟動print("end")     #啟動主進程##下面沒有等子線程就結束C:\Python35\python.exe D:/linux/python/day-test/day9/test1.pyendProcess finished with exit code 0

join用法

import threading    #匯入線程的模組import timedef task(a):    #進程的函數    time.sleep(3)    #等待一秒    print(a)for i in range(5):    t = threading.Thread(target=task,args=[i,])   #建立了進程,target表示要建立的進程    t.setDaemon(False)    #主進程是否等待子線程,False 是等待 True是不等待    t.start()                #進程啟動    t.join()       #等待的最大時間,等待的是子線程的已耗用時間,預設為一直等print("end")     #啟動主進程#輸出:C:\Python35\python.exe D:/linux/python/day-test/day9/test1.py01234end


線程的鎖

 單個鎖

import threadingimport timev = 10#1、只能一個人使用鎖#lock = threading.Lock()  #此鎖只能鎖一次lock = threading.RLock()  #此鎖可以鎖多層def task(arg):    time.sleep(2)    #申請使用鎖,其他人等待    lock.acquire()    lock.acquire()    lock.acquire()    global v    v -= 1    print(v)    #釋放    lock.release()    lock.release()    lock.release()for i in range(10):    t = threading.Thread(target=task,args=(i,))    t.start()

多個人的鎖

import threadingimport timev = 10#1、多個人使用鎖lock = threading.BoundedSemaphore(3)  #此鎖可以被多人使用3代表3個人同時使用def task(arg):   # time.sleep(2)    #申請使用鎖,其他人等待    lock.acquire()    time.sleep(1)    global v    v -= 1    print(v)    #釋放    lock.release()for i in range(10):    t = threading.Thread(target=task,args=(i,))    t.start()

事件鎖

import requestsimport threadingimport timelock = threading.Event()  #進程鎖的方式def task(arg):    time.sleep(1)    lock.wait()  #進程等候命令,開鎖    print(arg)for i in range(5):    t = threading.Thread(target=task,args=(i,))    t.start()while True:    value = input(">>>>>")    if value == "1":        lock.set()   #開鎖#輸出:C:\Python35\python.exe D:/linux/python/day-test/day9/事件鎖.py>>>>>>>>>>2>>>>>1    #輸入1之後開鎖>>>>>04312

自訂鎖,自己設定線程的鎖的個數

import threadingimport timelock = threading.Condition()def task(arg):    time.sleep(1)    #鎖住所有線程    lock.acquire()    #獲得鎖    lock.wait()       #鎖等候    #申請使用鎖,其他人等待    print("線程",arg)    lock.release()  #釋放鎖for i in range(10):    t = threading.Thread(target=task,args=(i,))    t.start()while True:    value = input(">>>>>>>>")    lock.acquire()        #獲得鎖    lock.notify(int(value))  #設定釋放的線程,你寫幾個上麵線程釋放幾個    lock.release()  #釋放鎖

輸出:

>>>>>>>>6>>>>>>>>線程 2線程 4線程 3線程 1線程 0線程 8

 

python-進程、線程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.