線程和進(jìn)程
功能
進(jìn)程,能夠完成多任務(wù),比如在一臺電腦上能夠同時運(yùn)行多個QQ。
線程,能夠完成多任務(wù),比如一個QQ中的多個聊天窗口。
定義的不同
- 進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個獨(dú)立單位。
- 線程是進(jìn)程的一個實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位。線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與同屬一個進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源。
區(qū)別
- 一個程序至少有一個進(jìn)程,一個進(jìn)程至少有一個線程。
- 線程的劃分尺度小于進(jìn)程(資源比進(jìn)程少),使得多線程程序的并發(fā)性高。
- 進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個線程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率。
- 線程不能夠獨(dú)立執(zhí)行,必須依存在進(jìn)程中??梢詫⑦M(jìn)程理解為工廠中的一條流水線,而其中的線程就是這個流水線上的工人。
優(yōu)缺點(diǎn)
線程和進(jìn)程在使用上各有優(yōu)缺點(diǎn):線程執(zhí)行開銷小,但不利于資源的管理和保護(hù);而進(jìn)程則相反。
進(jìn)程間通信-Queue
from multiprocessing import Queue
q = Queue(3) # 初始化一個Queue對象,最多可接收三條put消息
q.put("消息1")
q.put("消息2")
print(q.full()) # False
q.put("消息3")
print(q.full()) # True
# 因?yàn)橄⒘嘘?duì)已滿下面的try都會拋出異常,第一個try會等待2秒后再拋出異常,第二個Try會立刻拋出異常
try:
q.put("消息4", True, 2)
except:
print("消息列隊(duì)已滿,現(xiàn)有消息數(shù)量:%s" % q.qsize())
try:
q.put_nowait("消息4")
except:
print("消息列隊(duì)已滿,現(xiàn)有消息數(shù)量:%s" % q.qsize())
# 推薦的方式,先判斷消息列隊(duì)是否已滿,再寫入
if not q.full():
q.put_nowait("消息4")
# 讀取消息時,先判斷消息列隊(duì)是否為空,再讀取
if not q.empty():
for i in range(q.qsize()):
print(q.get_nowait())
說明:
- 初始化
Queue()
對象時(例如:q=Queue()
),若括號中沒有指定最大可接收的消息數(shù)量,或數(shù)量為負(fù)值,那么就代表可接受的消息數(shù)量沒有上限(直到內(nèi)存的盡頭)。 -
Queue.qsize()
:返回當(dāng)前隊(duì)列包含的消息數(shù)量。 -
Queue.empty()
:如果隊(duì)列為空,返回True
,反之返回False
。 -
Queue.full()
:如果隊(duì)列滿了,返回True
,反之返回False
。 -
Queue.get([block[, timeout]])
:獲取隊(duì)列中的一條消息,然后將其從隊(duì)列中移除,block
默認(rèn)值為True
。- 如果
block
使用默認(rèn)值,且沒有設(shè)置timeout
(單位秒),消息隊(duì)列如果為空,此時程序?qū)⒈蛔枞ㄍT谧x取狀態(tài)),直到從消息隊(duì)列中讀到消息為止。如果設(shè)置了timeout
,則會等待timeout
秒,若還沒讀取到任何消息,則拋出"Queue.Empty"
異常。 - 如果
block
值為False
,消息隊(duì)列如果為空,則會立刻拋出"Queue.Empty"
異常。
- 如果
-
Queue.get_nowait()
:相當(dāng)于Queue.get(False)
。 -
Queue.put(item, [block[, timeout]])
:將item
消息寫入隊(duì)列,block
默認(rèn)值為True
。- 如果
block
使用默認(rèn)值,且沒有設(shè)置timeout
(單位秒),消息隊(duì)列如果已經(jīng)沒有空間可寫入,此時程序?qū)⒈蛔枞ㄍT趯懭霠顟B(tài)),直到從消息隊(duì)列騰出空間為止。如果設(shè)置了timeout
,則會等待timeout
秒,若還沒有空間,則拋出"Queue.Full"
異常。 - 如果
block
值為False
,消息隊(duì)列如果沒有空間可寫入,則會立刻拋出"Queue.Full"
異常。
- 如果
-
Queue.put_nowait(item)
:相當(dāng)于Queue.put(item, False)
。
使用Queue實(shí)現(xiàn)進(jìn)程共享
我們以Queue
為例,在父進(jìn)程中創(chuàng)建兩個子進(jìn)程,一個往Queue
里寫數(shù)據(jù),一個從Queue
里讀數(shù)據(jù):
from multiprocessing import Process, Queue
import os, time, random
# 寫數(shù)據(jù)進(jìn)程執(zhí)行的代碼:
def write(q):
for value in ['A', 'B', 'C']:
print('Put %s to queue...' % value)
q.put(value)
time.sleep(random.random())
# 讀數(shù)據(jù)進(jìn)程執(zhí)行的代碼:
def read(q):
while True:
if not q.empty():
value = q.get(True)
print('Get %s from queue.' % value)
time.sleep(random.random())
else:
break
if __name__=='__main__':
# 父進(jìn)程創(chuàng)建Queue,并傳給各個子進(jìn)程:
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))
# 啟動子進(jìn)程pw,寫入:
pw.start()
# 等待pw結(jié)束:
pw.join()
# 啟動子進(jìn)程pr,讀取:
pr.start()
pr.join()
print('所有數(shù)據(jù)都寫入并且讀完')
進(jìn)階案例
【Python】Python 實(shí)現(xiàn)猜單詞游戲——挑戰(zhàn)你的智力和運(yùn)氣!
【python】Python tkinter庫實(shí)現(xiàn)重量單位轉(zhuǎn)換器的GUI程序
【python】使用Selenium獲取(2023博客之星)的參賽文章
【python】使用Selenium和Chrome WebDriver來獲取 【騰訊云 Cloud Studio 實(shí)戰(zhàn)訓(xùn)練營】中的文章信息
使用騰訊云 Cloud studio 實(shí)現(xiàn)調(diào)度百度AI實(shí)現(xiàn)文字識別
【玩轉(zhuǎn)Python系列【小白必看】Python多線程爬蟲:下載表情包網(wǎng)站的圖片
【玩轉(zhuǎn)Python系列】【小白必看】使用Python爬取雙色球歷史數(shù)據(jù)并可視化分析
【玩轉(zhuǎn)python系列】【小白必看】使用Python爬蟲技術(shù)獲取代理IP并保存到文件中
【小白必看】Python圖片合成示例之使用PIL庫實(shí)現(xiàn)多張圖片按行列合成
【小白必看】Python爬蟲實(shí)戰(zhàn)之批量下載女神圖片并保存到本地
【小白必看】Python詞云生成器詳細(xì)解析及代碼實(shí)現(xiàn)
【小白必看】Python爬取NBA球員數(shù)據(jù)示例
【小白必看】使用Python爬取喜馬拉雅音頻并保存的示例代碼
【小白必看】使用Python批量下載英雄聯(lián)盟皮膚圖片的技術(shù)實(shí)現(xiàn)
【小白必看】Python爬蟲數(shù)據(jù)處理與可視化
【小白必看】輕松獲取王者榮耀英雄皮膚圖片的Python爬蟲程序
【小白必看】利用Python生成個性化名單Word文檔
【小白必看】Python爬蟲實(shí)戰(zhàn):獲取陰陽師網(wǎng)站圖片并自動保存
小白必看系列之圖書管理系統(tǒng)-登錄和注冊功能示例代碼
小白實(shí)戰(zhàn)100案例: 完整簡單的雙色球彩票中獎判斷程序,適合小白入門
使用 geopandas 和 shapely(.shp) 進(jìn)行地理空間數(shù)據(jù)處理和可視化
使用selenium爬取貓眼電影榜單數(shù)據(jù)
圖像增強(qiáng)算法Retinex原理與實(shí)現(xiàn)詳解
爬蟲入門指南(8): 編寫天氣數(shù)據(jù)爬蟲程序,實(shí)現(xiàn)可視化分析
爬蟲入門指南(7):使用Selenium和BeautifulSoup爬取豆瓣電影Top250實(shí)例講解【爬蟲小白必看】
爬蟲入門指南(6):反爬蟲與高級技巧:IP代理、User-Agent偽裝、Cookie繞過登錄驗(yàn)證及驗(yàn)證碼識別工具
爬蟲入門指南(5): 分布式爬蟲與并發(fā)控制 【提高爬取效率與請求合理性控制的實(shí)現(xiàn)方法】
爬蟲入門指南(4): 使用Selenium和API爬取動態(tài)網(wǎng)頁的最佳方法
爬蟲入門指南(3):Python網(wǎng)絡(luò)請求及常見反爬蟲策略應(yīng)對方法
爬蟲入門指南(2):如何使用正則表達(dá)式進(jìn)行數(shù)據(jù)提取和處理
爬蟲入門指南(1):學(xué)習(xí)爬蟲的基礎(chǔ)知識和技巧
深度學(xué)習(xí)模型在圖像識別中的應(yīng)用:CIFAR-10數(shù)據(jù)集實(shí)踐與準(zhǔn)確率分析
Python面向?qū)ο缶幊袒A(chǔ)知識和示例代碼
MySQL 數(shù)據(jù)庫操作指南:學(xué)習(xí)如何使用 Python 進(jìn)行增刪改查操作
Python文件操作指南:編碼、讀取、寫入和異常處理
使用Python和Selenium自動化爬取 #【端午特別征文】 探索技術(shù)極致,未來因你出“粽” # 的投稿文章
Python多線程與多進(jìn)程教程:全面解析、代碼案例與優(yōu)化技巧
Selenium自動化工具集 - 完整指南和使用教程
Python網(wǎng)絡(luò)爬蟲基礎(chǔ)進(jìn)階到實(shí)戰(zhàn)教程
Python入門教程:掌握for循環(huán)、while循環(huán)、字符串操作、文件讀寫與異常處理等基礎(chǔ)知識
Pandas數(shù)據(jù)處理與分析教程:從基礎(chǔ)到實(shí)戰(zhàn)
Python 中常用的數(shù)據(jù)類型及相關(guān)操作詳解
【2023年最新】提高分類模型指標(biāo)的六大方案詳解
Python編程入門基礎(chǔ)及高級技能、Web開發(fā)、數(shù)據(jù)分析和機(jī)器學(xué)習(xí)與人工智能文章來源:http://www.zghlxwxcb.cn/news/detail-668216.html
用4種回歸方法繪制預(yù)測結(jié)果圖表:向量回歸、隨機(jī)森林回歸、線性回歸、K-最近鄰回歸文章來源地址http://www.zghlxwxcb.cn/news/detail-668216.html
到了這里,關(guān)于【從零學(xué)習(xí)python 】84.深入理解線程和進(jìn)程的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!