在程序猿的世界中,線程和進(jìn)程是一個(gè)很重要的概念,很多人經(jīng)常弄不清線程和進(jìn)程到底是什么,有什么區(qū)別,本文試圖來(lái)解釋一下線程和進(jìn)程。首先來(lái)看一下概念:
進(jìn)程(英語(yǔ):process),是計(jì)算機(jī)中已運(yùn)行程序的實(shí)體。進(jìn)程為曾經(jīng)是分時(shí)系統(tǒng)的基本運(yùn)作單位。在面向進(jìn)程設(shè)計(jì)的系統(tǒng)(如早期的UNIX,Linux 2.4及更早的版本)中,進(jìn)程是程序的基本執(zhí)行實(shí)體;在面向線程設(shè)計(jì)的系統(tǒng)(如當(dāng)代多數(shù)操作系統(tǒng)、Linux 2.6及更新的版本)中,進(jìn)程本身不是基本運(yùn)行單位,而是線程的容器。程序本身只是指令、數(shù)據(jù)及其組織形式的描述,進(jìn)程才是程序(那些指令和數(shù)據(jù))的真正運(yùn)行實(shí)例。?C維基百科
線程(英語(yǔ):thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。?C維基百科
概念太嚇人了,先來(lái)看一下進(jìn)程,這個(gè)相對(duì)于線程來(lái)說(shuō)還是稍微好理解一點(diǎn)的。進(jìn)程,是程序運(yùn)行的實(shí)體,這句話的意思是,程序是存放在硬盤中的,當(dāng)這個(gè)程序運(yùn)行時(shí),就會(huì)產(chǎn)生若干個(gè)進(jìn)程,并且這個(gè)進(jìn)程是可見的,在windows8的任務(wù)管理器中,我們看到有下列進(jìn)程:
那么什么是線程呢?如果你編寫過程序,特別是類似windows的批處理這樣的邏輯控制語(yǔ)句少的語(yǔ)言,就能明顯感覺到,當(dāng)運(yùn)行一個(gè)程序是,實(shí)際上整個(gè)運(yùn)行的過程是從頭部一直運(yùn)行到尾部。例如有這樣一段批處理的代碼,提示用戶輸入姓名,然后根據(jù)姓名輸出問候:
@echo off set /p name=請(qǐng)輸入您的姓名: cls echo 你好,%name pause
這段小程序就是自上而下執(zhí)行,執(zhí)行完畢則退出。不管是批處理,像PHP,Node.JS等都是這樣自上而下執(zhí)行的。實(shí)際上這就是一個(gè)線程,可以這樣去理解:線程是一個(gè)任務(wù)流,它被包含在進(jìn)程之中。有個(gè)例子:
5月1號(hào)這一天,麥當(dāng)勞生意比較火爆,人很多,前臺(tái)有6個(gè)窗口,有4個(gè)窗口在工作,隨著要吃飯的人變多,麥當(dāng)勞不得不開放了剩余的兩個(gè)窗口。在這里,每一個(gè)窗口就是一個(gè)進(jìn)程,處理賣垃圾食品這樣一個(gè)任務(wù),讓系統(tǒng)需要處理更多請(qǐng)求時(shí)候,開放窗口就是增加進(jìn)程來(lái)處理需求。由于是假期,發(fā)現(xiàn)即使是6個(gè)窗口全開了,排隊(duì)的客戶還是很多,那么,這里是不是沒有其它的辦法了呢?效率都是逼出來(lái)的,經(jīng)理發(fā)現(xiàn),客戶買完?yáng)|西,在旁邊等,當(dāng)客戶的漢堡(或者其它垃圾食品)準(zhǔn)備好了,是由單獨(dú)的一個(gè)人(小明)把食品遞給客戶,由于這個(gè)人需要把準(zhǔn)備好的食物分別送給6個(gè)不同窗口的客戶,所以效率很低。這時(shí)候經(jīng)理發(fā)話了,食品準(zhǔn)備好了,直接由窗口的售賣人員把食品給正在等在的客戶,這樣比較節(jié)省時(shí)間。在這里,前臺(tái)售賣人員的工作就有原來(lái)的一項(xiàng)專門售賣商品的工作,變成了兩項(xiàng),就是兩個(gè)進(jìn)程。
進(jìn)上總結(jié),一個(gè)進(jìn)程中至少有一個(gè)線程,在實(shí)際的工作中,不是所有的程序都支持多線程,也有一些程序?qū)Χ噙M(jìn)程也支持得不夠好,像PHP,Node.js等都是單進(jìn)程,單線程的。
下面這個(gè)python的腳本讓一個(gè)進(jìn)程中運(yùn)行兩個(gè)線程:
import time import thread def Ordering(interval): cnt = 0 while cnt<100: print '好了,你訂餐成功,訂餐號(hào)碼是:%d號(hào) 訂餐時(shí)間是:%s 請(qǐng)?jiān)谂赃吥托牡却齖n\n'%(cnt, time.ctime()) time.sleep(interval) cnt+=1 thread.exit_thread() def Notice(interval): cnt = 0 while cnt<100: print '誰(shuí)的號(hào)碼是%d,您的餐好了,過來(lái)取一下\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()
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
