線程和進程的區(qū)別及Python代碼實例
在程序猿的世界中,線程和進程是一個很重要的概念,很多人經(jīng)常弄不清線程和進程到底是什么,有什么區(qū)別,本文試圖來解釋一下線程和進程。首先來看一下概念:
進程(英語:process),是計算機中已運行程序的實體。進程為曾經(jīng)是分時系統(tǒng)的基本運作單位。在面向進程設(shè)計的系統(tǒng)(如早期的UNIX,Linux 2.4及更早的版本)中,進程是程序的基本執(zhí)行實體;在面向線程設(shè)計的系統(tǒng)(如當代多數(shù)操作系統(tǒng)、Linux 2.6及更新的版本)中,進程本身不是基本運行單位,而是線程的容器。程序本身只是指令、數(shù)據(jù)及其組織形式的描述,進程才是程序(那些指令和數(shù)據(jù))的真正運行實例。–維基百科
線程(英語:thread)是操作系統(tǒng)能夠進行運算調(diào)度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務。–維基百科
概念太嚇人了,先來看一下進程,這個相對于線程來說還是稍微好理解一點的。進程,是程序運行的實體,這句話的意思是,程序是存放在硬盤中的,當這個程序運行時,就會產(chǎn)生若干個進程,并且這個進程是可見的,在windows8的任務管理器中,我們看到有下列進程:

那么什么是線程呢?如果你編寫過程序,特別是類似windows的批處理這樣的邏輯控制語句少的語言,就能明顯感覺到,當運行一個程序是,實際上整個運行的過程是從頭部一直運行到尾部。例如有這樣一段批處理的代碼,提示用戶輸入姓名,然后根據(jù)姓名輸出問候:
@echo off set /p name=請輸入您的姓名: cls echo 你好,%name pause
這段小程序就是自上而下執(zhí)行,執(zhí)行完畢則退出。不管是批處理,像PHP,Node.JS等都是這樣自上而下執(zhí)行的。實際上這就是一個線程,可以這樣去理解:線程是一個任務流,它被包含在進程之中。有個例子:
5月1號這一天,麥當勞生意比較火爆,人很多,前臺有6個窗口,有4個窗口在工作,隨著要吃飯的人變多,麥當勞不得不開放了剩余的兩個窗口。在這里,每一個窗口就是一個進程,處理賣垃圾食品這樣一個任務,讓系統(tǒng)需要處理更多請求時候,開放窗口就是增加進程來處理需求。由于是假期,發(fā)現(xiàn)即使是6個窗口全開了,排隊的客戶還是很多,那么,這里是不是沒有其它的辦法了呢?效率都是逼出來的,經(jīng)理發(fā)現(xiàn),客戶買完東西,在旁邊等,當客戶的漢堡(或者其它垃圾食品)準備好了,是由單獨的一個人(小明)把食品遞給客戶,由于這個人需要把準備好的食物分別送給6個不同窗口的客戶,所以效率很低。這時候經(jīng)理發(fā)話了,食品準備好了,直接由窗口的售賣人員把食品給正在等在的客戶,這樣比較節(jié)省時間。在這里,前臺售賣人員的工作就有原來的一項專門售賣商品的工作,變成了兩項,就是兩個進程。
進上總結(jié),一個進程中至少有一個線程,在實際的工作中,不是所有的程序都支持多線程,也有一些程序?qū)Χ噙M程也支持得不夠好,像PHP,Node.js等都是單進程,單線程的。
下面這個python的腳本讓一個進程中運行兩個線程:
import time
import thread
def Ordering(interval):
cnt = 0
while cnt<100:
print '好了,你訂餐成功,訂餐號碼是:%d號 訂餐時間是:%s 請在旁邊耐心等待\n\n'%(cnt, time.ctime())
time.sleep(interval)
cnt+=1
thread.exit_thread()
def Notice(interval):
cnt = 0
while cnt<100:
print '誰的號碼是%d,您的餐好了,過來取一下\n'%(cnt)
time.sleep(interval)
cnt+=1
thread.exit_thread()
def work(): #Use thread.start_new_thread() to create 2 new threads
thread.start_new_thread(Ordering,(1,))
thread.start_new_thread(Notice,(5,))
if __name__=='__main__':
work()
相關(guān)文章
python3 tkinter實現(xiàn)添加圖片和文本
這篇文章主要為大家詳細介紹了python3 tkinter實現(xiàn)添加圖片和文本,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11
使用python-magic和wxPython實現(xiàn)識別文檔類型
這篇文章主要介紹了如何使用python-magic模塊和wxPython庫創(chuàng)建一個簡單的文件列表應用程序,該應用程序可以顯示所選文件夾中文件的類型,需要的可以參考下2023-08-08
Python+OpenCV 實現(xiàn)簡單的高斯濾波(推薦)
這篇文章主要介紹了Python+OpenCV 實現(xiàn)簡單的高斯濾波,在文中需要注意的是,這里我沒有特判當sigma = 0的時候的情況,具體實現(xiàn)過程跟隨小編一起看看吧2021-09-09
Python Matplotlib繪圖基礎(chǔ)知識代碼解析
這篇文章主要介紹了Python Matplotlib繪圖基礎(chǔ)知識代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08
Python統(tǒng)計文件中去重后uuid個數(shù)的方法
這篇文章主要介紹了Python統(tǒng)計文件中去重后uuid個數(shù)的方法,實例分析了Python正則匹配及字符串操作的相關(guān)技巧,需要的朋友可以參考下2015-07-07
Django使用視圖動態(tài)輸出CSV以及PDF的操作詳解
這篇文章主要介紹了Django 如何使用視圖動態(tài)輸出 CSV 以及 PDF,我們需要用到 python 的 csv 和 reportLab 庫,通過django視圖來定義輸出我們需要的 csv 或者 pdf 文件,需要的朋友可以參考下2024-06-06
Linux添加Python?path方法及修改環(huán)境變量的三種方法
這篇文章主要介紹了Linux添加Python?path方法及修改環(huán)境變量的三種方法,Linux 下設(shè)置環(huán)境變量有三種方法,一種用于當前終端,一種用于當前用戶,一種用于所有用戶,本文對每種方法給大家介紹的非常詳細,需要的朋友可以參考下2022-07-07
python-tkinter之按鈕的使用,開關(guān)方法
今天小編就為大家分享一篇python-tkinter之按鈕的使用,開關(guān)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06

