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