區(qū)分python中的進程與線程
今天整理的文章是給大家梳理Python的進程與線程的區(qū)別,沒什么代碼,希望大家能清楚知道他們的區(qū)別,什么情況用線程,什么情況用進程做到心中有數(shù),希望大家能熟練掌握.
進程的基本概念
概念
進程就是一個程序在一個數(shù)據(jù)集上的一次動態(tài)執(zhí)行過程。進程一般由程序、數(shù)據(jù)集、進程控制塊三部分組成。我們編寫的程序用來描述進程要完成哪些功能以及如何完成;數(shù)據(jù)集則是程序在執(zhí)行過程中所需要使用的資源;進程控制塊用來記錄進程的外部特征,描述進程的執(zhí)行變化過程,系統(tǒng)可以利用它來控制和管理進程,它是系統(tǒng)感知進程存在的唯一標志。
線程的基本概念
概念
線程是進程中執(zhí)行運算的最小單位,是進程中的一個實體,是被系統(tǒng)獨立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創(chuàng)建和撤消另一個線程,同一進程中的多個線程之間可以并發(fā)執(zhí)行。
好處
- 易于調(diào)度。
- 提高并發(fā)性,通過線程可方便有效地實現(xiàn)并發(fā)性。進程可創(chuàng)建多個線程來執(zhí)行同一程序的不同部分。
- 開銷少,創(chuàng)建線程比創(chuàng)建進程要快,所需開銷很少
進程的基本狀態(tài)及狀態(tài)之間的關(guān)系
狀態(tài):運行、阻塞、掛起阻塞、就緒、掛起就緒
狀態(tài)之間的轉(zhuǎn)換:
- 準備就緒的進程,被CPU調(diào)度執(zhí)行,變成運行態(tài);
- 運行中的進程,進行I/O請求或者不能得到所請求的資源,變成阻塞態(tài);
- 運行中的進程,進程執(zhí)行完畢(或時間片已到),變成就緒態(tài);
- 將阻塞態(tài)的進程掛起,變成掛起阻塞態(tài),當(dāng)導(dǎo)致進程阻塞的I/O操作在用戶重啟進程前完成(稱之為喚醒),掛起阻塞態(tài)變成掛起就緒態(tài),當(dāng)用戶在I/O操作結(jié)束之前重啟進程,掛起阻塞態(tài)變成阻塞態(tài);
- 將就緒(或運行)中的進程掛起,變成掛起就緒態(tài),當(dāng)該進程恢復(fù)之后,掛起就緒態(tài)變成就緒態(tài);
進程和線程的關(guān)系:
- 一個線程只能屬于一個進程,而一個進程可以有多個線程,但至少有一個線程。
- 資源分配給進程,同一進程的所有線程共享該進程的所有資源。
- 處理機分給線程,即真正在處理機上運行的是線程
- 線程在執(zhí)行過程中,需要協(xié)作同步。不同進程的線程間要利用消息通信的辦法實現(xiàn)同步。線程是指進程內(nèi)的一個執(zhí)行單元,也是進程內(nèi)的可調(diào)度實體.
進程與線程的區(qū)別:
- 運行方式不同
進程不能單獨執(zhí)行,它只是資源的集合。
進程要操作CPU,必須要先創(chuàng)建一個線程。
所有在同一個進程里的線程,是同享同一塊進程所占的內(nèi)存空間。
- 關(guān)系
進程中第一個線程是主線程,主線程可以創(chuàng)建其他線程;其他線程也可以創(chuàng)建線程;線程之間是平等的。
進程有父進程和子進程,獨立的內(nèi)存空間,唯一的標識符:pid。
- 速度
啟動線程比啟動進程快
運行線程和運行進程速度上是一樣的,沒有可比性
線程共享內(nèi)存空間,進程的內(nèi)存是獨立的。
- 創(chuàng)建
父進程生成子進程,相當(dāng)于復(fù)制一份內(nèi)存空間,進程之間不能直接訪問
創(chuàng)建新線程很簡單,創(chuàng)建新進程需要對父進程進行一次復(fù)制
一個線程可以控制和操作同級線程里的其他線程,但是進程只能操作子進程。
- 交互
同一個進程里的線程之間可以直接訪問。
兩個進程想通信必須通過一個中間代理來實現(xiàn)。
- 調(diào)度
線程作為調(diào)度和分配的基本單位,進程作為擁有資源的基本單位
- 并發(fā)性
不僅進程之間可以并發(fā)執(zhí)行,同一個進程的多個線程之間也可并發(fā)執(zhí)行
- 擁有資源:
進程是擁有資源的一個獨立單位,線程不擁有系統(tǒng)資源,但可以訪問隸屬于進程的資源.
- 系統(tǒng)開銷:
在創(chuàng)建或撤消進程時,由于系統(tǒng)都要為之分配和回收資源,導(dǎo)致系統(tǒng)的開銷明顯大于創(chuàng)建或撤消線程時的開銷。
以上就是區(qū)分python中的進程與線程的詳細內(nèi)容,更多關(guān)于python進程與線程的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
簡單了解python的break、continue、pass
這篇文章主要介紹了簡單了解python的break、continue、pass,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07python中判斷類型函數(shù)isinstance()示例詳解
isinstance()函數(shù)是Python的內(nèi)置函數(shù),用于判斷一個變量是否是某個類型或者是該類型的子類的實例,在Python中,所有類都繼承自object,所以任何實例都會是object的實例,本文給大家介紹python中判斷類型函數(shù)isinstance(),感興趣的朋友一起看看吧2024-10-10將Pytorch模型從CPU轉(zhuǎn)換成GPU的實現(xiàn)方法
今天小編就為大家分享一篇將Pytorch模型從CPU轉(zhuǎn)換成GPU的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08Pytorch DataLoader shuffle驗證方式
這篇文章主要介紹了Pytorch DataLoader shuffle驗證方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06通過Python 獲取Android設(shè)備信息的輕量級框架
今天跟大家分享一下,如何通過Python實現(xiàn)一個輕量級的庫來獲取電腦上連接的Android設(shè)備信息,需要的朋友參考下吧2017-12-12Python?pandas中apply函數(shù)簡介以及用法詳解
apply()函數(shù)是pandas里面所有函數(shù)中自由度最高的函數(shù), apply()函數(shù)的參數(shù)是一個函數(shù)指針,這里可以使用lambda表達式幫助簡化代碼,下面這篇文章主要給大家介紹了關(guān)于Python?pandas中apply函數(shù)簡介以及用法的相關(guān)資料,需要的朋友可以參考下2022-09-09pytorch交叉熵損失函數(shù)的weight參數(shù)的使用
這篇文章主要介紹了pytorch交叉熵損失函數(shù)的weight參數(shù)的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05