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

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