日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python-进程、线程

發(fā)布時(shí)間:2024/9/5 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python-进程、线程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、解釋:

? ?相信百分之百的同學(xué)都會(huì)用到操作系統(tǒng),別說(shuō)不用,不用的話特么你怎么看的我的博客,而我們的操作系統(tǒng)你可以一遍看著我寫(xiě)的博客,又一遍聽(tīng)著音樂(lè),說(shuō)到音樂(lè)給大家推薦一首叫做"Shape of You",而我就是邊聽(tīng)著音樂(lè)邊寫(xiě)博客,哈哈.....;那么這里我們就要想了,我們的計(jì)算機(jī)又是怎么來(lái)運(yùn)算的呢?怎么同時(shí)開(kāi)啟這么多任務(wù)的呢?而且還有好多任務(wù)偷偷的在后臺(tái)運(yùn)行著呢,只是桌面上沒(méi)有顯示而已。

? ?而現(xiàn)在多核心多線程的計(jì)算機(jī)已經(jīng)很普及,是的,這樣計(jì)算的并發(fā)可以更多更快,但是在計(jì)算機(jī)剛流行的時(shí)候,很多單核CPU又怎么執(zhí)行多任務(wù)的呢?畢竟CPU執(zhí)行代碼都是按照順序執(zhí)行的;而答案就是計(jì)算機(jī)上的操作系統(tǒng)輪流讓各個(gè)任務(wù)交替執(zhí)行,任務(wù)A執(zhí)行0.01秒,切換到任務(wù)B上執(zhí)行0.01秒,再切換到任務(wù)3上,這樣反復(fù)下去,表面上看每個(gè)任務(wù)都是交替執(zhí)行的,但是,由于CPU的執(zhí)行速度實(shí)在是太快了,我們感覺(jué)就像所有任務(wù)都在同時(shí)執(zhí)行一樣。

? 所以,我們?cè)谌粘_\(yùn)行的環(huán)境中,并行執(zhí)行多任務(wù)只能在多核心多線程的CPU上實(shí)現(xiàn),但是我們有的時(shí)候任務(wù)數(shù)量遠(yuǎn)遠(yuǎn)多于CPU的核心數(shù)量,所以,操作系統(tǒng)也會(huì)自動(dòng)把很多任務(wù)輪流調(diào)度到每個(gè)核心上執(zhí)行。?

? ?對(duì)于操作系統(tǒng)來(lái)說(shuō),一個(gè)任務(wù)就是一個(gè)進(jìn)程(Process),比如打開(kāi)一個(gè)瀏覽器就是啟動(dòng)一個(gè)瀏覽器進(jìn)程,打開(kāi)一個(gè)記事本就啟動(dòng)了一個(gè)記事本進(jìn)程,打開(kāi)兩個(gè)記事本就啟動(dòng)了兩個(gè)記事本進(jìn)程,打開(kāi)一個(gè)Word就啟動(dòng)了一個(gè)Word進(jìn)程。

? 有些進(jìn)程還不止同時(shí)干一件事,比如Word,它可以同時(shí)進(jìn)行打字、拼寫(xiě)檢查、打印等事情。在一個(gè)進(jìn)程內(nèi)部,要同時(shí)干多件事,就需要同時(shí)運(yùn)行多個(gè)“子任務(wù)”,我們把進(jìn)程內(nèi)的這些“子任務(wù)”稱(chēng)為線程(Thread)。
? 由于每個(gè)進(jìn)程至少要干一件事,所以,一個(gè)進(jìn)程至少有一個(gè)線程。當(dāng)然,像Word這種復(fù)雜的進(jìn)程可以有多個(gè)線程,多個(gè)線程可以同時(shí)執(zhí)行,多線程的執(zhí)行方式和多進(jìn)程是一樣的,也是由操作系統(tǒng)在多個(gè)線程之間快速切換,讓每個(gè)線程都短暫地交替運(yùn)行,看起來(lái)就像同時(shí)執(zhí)行一樣。當(dāng)然,真正地同時(shí)執(zhí)行多線程需要多核CPU才可能實(shí)現(xiàn)。

? 總結(jié):

? ?應(yīng)用程序--->進(jìn)程--->線程 ?

? ?應(yīng)用程序最少有一個(gè)進(jìn)程,而一個(gè)進(jìn)程最后有一個(gè)主線程,而一個(gè)程序可以啟多個(gè)進(jìn)程,一個(gè)進(jìn)程可以啟動(dòng)多個(gè)線程,而它們都有自己的主進(jìn)程和主線程,而進(jìn)程和線程都是有CPU來(lái)運(yùn)算,運(yùn)算方式就是來(lái)回切換運(yùn)算。

線程和進(jìn)程Python與其它開(kāi)發(fā)語(yǔ)言的不同,其它語(yǔ)言線程之間可以在多個(gè)CPU之間切換,而Python不支持多線程,只能多進(jìn)程(前提是被CPU調(diào)用),所以出現(xiàn)了以下應(yīng)用場(chǎng)景

?應(yīng)用場(chǎng)景:

? ?IO密集型:多線程

? ?計(jì)算密集型:多進(jìn)程

?GIL,全局解釋器鎖,保證同一個(gè)進(jìn)程中只有一個(gè)線程同時(shí)被調(diào)用

二、線程的使用

? 看代碼

?

import threading #導(dǎo)入線程的模塊 import time def task(a): #進(jìn)程的函數(shù)time.sleep(1) #等待一秒print(a) for i in range(30): #同時(shí)啟動(dòng)30個(gè)線程t = threading.Thread(target=task,args=[i,]) #創(chuàng)建了進(jìn)程,target表示要?jiǎng)?chuàng)建的進(jìn)程t.start() #進(jìn)程啟動(dòng),表示開(kāi)始工作 print("end") #啟動(dòng)主進(jìn)程

?

setDaemon的用法

?說(shuō)明:setDaemon 設(shè)置主進(jìn)程是否等待子線程結(jié)束了,再結(jié)束自己,默認(rèn)選項(xiàng)為(False)

?例子: (默認(rèn)選項(xiàng))

import threading #導(dǎo)入線程的模塊 import time def task(a): #進(jìn)程的函數(shù)time.sleep(1) #等待一秒print(a) for i in range(5):t = threading.Thread(target=task,args=[i,]) #創(chuàng)建了進(jìn)程,target表示要?jiǎng)?chuàng)建的進(jìn)程t.setDaemon(False) #主進(jìn)程是否等待子線程,False 是等待 True是不等待t.start() #進(jìn)程啟動(dòng) print("end") #啟動(dòng)主進(jìn)程 ###輸出如下: C:\Python35\python.exe D:/linux/python/day-test/day9/test1.py end 0 2 1 3 4

非默認(rèn)選項(xiàng)(True)

import threading #導(dǎo)入線程的模塊
import time
def task(a): #進(jìn)程的函數(shù)
time.sleep(1) #等待一秒
print(a)
for i in range(5):
t = threading.Thread(target=task,args=[i,]) #創(chuàng)建了進(jìn)程,target表示要?jiǎng)?chuàng)建的進(jìn)程
t.setDaemon(True) #主進(jìn)程是否等待子線程,False 是等待 True是不等待
t.start() #進(jìn)程啟動(dòng)
print("end") #啟動(dòng)主進(jìn)程

輸出如下: import threading #導(dǎo)入線程的模塊 import time def task(a): #進(jìn)程的函數(shù)time.sleep(1) #等待一秒print(a) for i in range(5):t = threading.Thread(target=task,args=[i,]) #創(chuàng)建了進(jìn)程,target表示要?jiǎng)?chuàng)建的進(jìn)程t.setDaemon(True) #主進(jìn)程是否等待子線程,False 是等待 True是不等待t.start() #進(jìn)程啟動(dòng) print("end") #啟動(dòng)主進(jìn)程##下面沒(méi)有等子線程就結(jié)束 C:\Python35\python.exe D:/linux/python/day-test/day9/test1.py endProcess finished with exit code 0

join用法

import threading #導(dǎo)入線程的模塊 import time def task(a): #進(jìn)程的函數(shù)time.sleep(3) #等待一秒print(a) for i in range(5):t = threading.Thread(target=task,args=[i,]) #創(chuàng)建了進(jìn)程,target表示要?jiǎng)?chuàng)建的進(jìn)程t.setDaemon(False) #主進(jìn)程是否等待子線程,False 是等待 True是不等待t.start() #進(jìn)程啟動(dòng)t.join() #等待的最大時(shí)間,等待的是子線程的運(yùn)行時(shí)間,默認(rèn)為一直等 print("end") #啟動(dòng)主進(jìn)程 #輸出: C:\Python35\python.exe D:/linux/python/day-test/day9/test1.py 0 1 2 3 4 end


線程的鎖

?單個(gè)鎖

import threading import time v = 10 #1、只能一個(gè)人使用鎖 #lock = threading.Lock() #此鎖只能鎖一次 lock = threading.RLock() #此鎖可以鎖多層 def task(arg):time.sleep(2)#申請(qǐng)使用鎖,其他人等待 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()

多個(gè)人的鎖

import threading import time v = 10 #1、多個(gè)人使用鎖 lock = threading.BoundedSemaphore(3) #此鎖可以被多人使用3代表3個(gè)人同時(shí)使用 def task(arg):# time.sleep(2)#申請(qǐng)使用鎖,其他人等待 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() #進(jìn)程鎖的方式 def task(arg):time.sleep(1)lock.wait() #進(jìn)程等候命令,開(kāi)鎖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() #開(kāi)鎖#輸出: C:\Python35\python.exe D:/linux/python/day-test/day9/事件鎖.py >>>>> >>>>>2 >>>>>1 #輸入1之后開(kāi)鎖 >>>>>0 4 3 1 2

自定義鎖,自己設(shè)置線程的鎖的個(gè)數(shù)

import threading import time lock = threading.Condition() def task(arg):time.sleep(1)#鎖住所有線程lock.acquire() #獲得鎖lock.wait() #鎖等候#申請(qǐng)使用鎖,其他人等待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)) #設(shè)置釋放的線程,你寫(xiě)幾個(gè)上面線程釋放幾個(gè)lock.release() #釋放鎖

輸出:

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

?連接池

from concurrent.futures import ThreadPoolExecutor #導(dǎo)入鏈接池模塊 import time import requests def task(url1):response = requests.get(url) #獲取請(qǐng)求print("得到結(jié)果:",url,len(response.content)) # pool = ThreadPoolExecutor(2) #創(chuàng)建個(gè)鏈接池 括號(hào)里的2是鏈接池可以同時(shí)接兩個(gè)連接 url_list = ["http://www.oldboyedu.com","http://www.baidu.com","http://www.17ugo.com", ] for url in url_list:print("開(kāi)始請(qǐng)求",url)pool.submit(task,url) #鏈接池使用submit方法獲取;去鏈接池中獲取鏈接

?

轉(zhuǎn)載于:https://www.cnblogs.com/Plynn/p/6592683.html

總結(jié)

以上是生活随笔為你收集整理的python-进程、线程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。