python-进程、线程
一、解釋:
? ?相信百分之百的同學都會用到操作系統,別說不用,不用的話特么你怎么看的我的博客,而我們的操作系統你可以一遍看著我寫的博客,又一遍聽著音樂,說到音樂給大家推薦一首叫做"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 time def 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 time def 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.py end 0 2 1 3 4非默認選項(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 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") #啟動主進程##下面沒有等子線程就結束 C:\Python35\python.exe D:/linux/python/day-test/day9/test1.py endProcess finished with exit code 0
join用法
import threading #導入線程的模塊 import time def 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.py 0 1 2 3 4 end線程的鎖
?單個鎖
import threading import time v = 10 #1、只能一個人使用鎖 #lock = threading.Lock() #此鎖只能鎖一次 lock = threading.RLock() #此鎖可以鎖多層 def task(arg):time.sleep(2)#申請使用鎖,其他人等待 lock.acquire()lock.acquire()lock.acquire()global vv -= 1print(v)#釋放 lock.release()lock.release()lock.release() for i in range(10):t = threading.Thread(target=task,args=(i,))t.start()多個人的鎖
import threading import time v = 10 #1、多個人使用鎖 lock = threading.BoundedSemaphore(3) #此鎖可以被多人使用3代表3個人同時使用 def task(arg):# time.sleep(2)#申請使用鎖,其他人等待 lock.acquire()time.sleep(1)global vv -= 1print(v)#釋放 lock.release() for i in range(10):t = threading.Thread(target=task,args=(i,))t.start()事件鎖
import requests import threading import 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之后開鎖 >>>>>0 4 3 1 2自定義鎖,自己設置線程的鎖的個數
import threading import time lock = 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?連接池
from concurrent.futures import ThreadPoolExecutor #導入鏈接池模塊 import time import requests def task(url1):response = requests.get(url) #獲取請求print("得到結果:",url,len(response.content)) # pool = ThreadPoolExecutor(2) #創建個鏈接池 括號里的2是鏈接池可以同時接兩個連接 url_list = ["http://www.oldboyedu.com","http://www.baidu.com","http://www.17ugo.com", ] for url in url_list:print("開始請求",url)pool.submit(task,url) #鏈接池使用submit方法獲取;去鏈接池中獲取鏈接?
轉載于:https://www.cnblogs.com/Plynn/p/6592683.html
總結
以上是生活随笔為你收集整理的python-进程、线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017.3.20上午
- 下一篇: 面向对象基础及UML建模语言