同步与异步以及线程与进程
生活随笔
收集整理的這篇文章主要介紹了
同步与异步以及线程与进程
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
寫(xiě)過(guò)爬蟲(chóng)的都知道,爬蟲(chóng)的性能瓶頸在于IO,因?yàn)榕老x(chóng)是一個(gè)IO密集型業(yè)務(wù),程序需要發(fā)起網(wǎng)絡(luò)請(qǐng)求,必然就有IO阻塞,
通常請(qǐng)求一個(gè)URL耗時(shí)要幾百毫秒到幾秒不等,而我們的CPU處理速度驚人,兩者的速度就好比烏龜跟火箭的差別。
在單線程同步阻塞程序中,如果要獲取一個(gè)網(wǎng)站所有的URL,假設(shè)100個(gè)URL,平均每個(gè)URL請(qǐng)求的時(shí)間是1秒,
那么在單線程同步場(chǎng)景下,最快也需要100秒鐘,才能把所有的頁(yè)面爬取下來(lái)。
于是,我們想到了更好的一種辦法就是采用多線程或者多進(jìn)程,但是由于在Python中臭名昭著的GIL,導(dǎo)致做不到真正的并行運(yùn)算,
在同一時(shí)間內(nèi),就算有多核CPU,也無(wú)法被利用起來(lái),這樣雖然能做到并發(fā),但是沒(méi)法并行,在單個(gè)CPU里切換線程,還有切換成本,以及線程的創(chuàng)造成本。
如果使用多進(jìn)程,雖然能利用多核處理的優(yōu)勢(shì),但是多進(jìn)程的創(chuàng)建成本比線程更高,而IO密集型任務(wù),CPU不是瓶頸。
所以,后來(lái)Python引入了異步編程,異步編程使得CPU不再需要再去等待耗時(shí)的操作,而是讓出CPU時(shí)間給其他任務(wù)執(zhí)行,
熟悉電腦硬件的朋友肯定對(duì)DMA這個(gè)詞不陌生,硬盤、光驅(qū)的技術(shù)規(guī)格中都有明確DMA的模式指標(biāo),其實(shí)網(wǎng)卡、聲卡、顯卡也是有DMA功能的。
DMA就是直接內(nèi)存訪問(wèn)的意思,也就是說(shuō),擁有DMA功能的硬件在和內(nèi)存進(jìn)行數(shù)據(jù)交換的時(shí)候可以不消耗CPU資源。
只要CPU在發(fā)起數(shù)據(jù)傳輸時(shí)發(fā)送一個(gè)指令,硬件就開(kāi)始自己和內(nèi)存交換數(shù)據(jù),在傳輸完成之后硬件會(huì)觸發(fā)一個(gè)中斷來(lái)通知操作完成。
這些無(wú)須消耗CPU時(shí)間的I/O操作正是異步操作的硬件基礎(chǔ)。所以即使在DOS這樣的單進(jìn)程(而且無(wú)線程概念)系統(tǒng)中也同樣可以發(fā)起異步的DMA操作。
而異步則是相反,*調(diào)用*在發(fā)出之后,這個(gè)調(diào)用就直接返回了,所以沒(méi)有返回結(jié)果。換句話說(shuō),當(dāng)一個(gè)異步過(guò)程調(diào)用發(fā)出后,調(diào)用者不會(huì)立刻得到結(jié)果。
而是在*調(diào)用*發(fā)出后,*被調(diào)用者*通過(guò)狀態(tài)、通知來(lái)通知調(diào)用者,或通過(guò)回調(diào)函數(shù)處理這個(gè)調(diào)用。典型的異步編程模型比如Node.js
舉個(gè)通俗的例子:
你打電話問(wèn)書(shū)店老板有沒(méi)有《分布式系統(tǒng)》這本書(shū),如果是同步通信機(jī)制,書(shū)店老板會(huì)說(shuō),你稍等,”我查一下",然后開(kāi)始查啊查,等查好了(可能是5秒,也可能是一天)告訴你結(jié)果(返回結(jié)果)。
而異步通信機(jī)制,書(shū)店老板直接告訴你我查一下啊,查好了打電話給你,然后直接掛電話了(不返回結(jié)果)。然后查好了,他會(huì)主動(dòng)打電話給你。在這里老板通過(guò)“回電”這種方式來(lái)回調(diào)。
阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會(huì)被掛起。調(diào)用線程只有在得到結(jié)果之后才會(huì)返回。
非阻塞調(diào)用指在不能立刻得到結(jié)果之前,該調(diào)用不會(huì)阻塞當(dāng)前線程。
還是上面的例子,
你打電話問(wèn)書(shū)店老板有沒(méi)有《分布式系統(tǒng)》這本書(shū),你如果是阻塞式調(diào)用,你會(huì)一直把自己“掛起”,直到得到這本書(shū)有沒(méi)有的結(jié)果,
如果是非阻塞式調(diào)用,你不管老板有沒(méi)有告訴你,你自己先一邊去玩了, 當(dāng)然你也要偶爾過(guò)幾分鐘check一下老板有沒(méi)有返回結(jié)果。
在這里阻塞與非阻塞與是否同步異步無(wú)關(guān)。跟老板通過(guò)什么方式回答你結(jié)果無(wú)關(guān)。
進(jìn)程:具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位.
線程:進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位。
線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),
但是它可與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源.
2.關(guān)系
一個(gè)線程可以創(chuàng)建和撤銷另一個(gè)線程;同一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行.
相對(duì)進(jìn)程而言,線程是一個(gè)更加接近于執(zhí)行體的概念,它可以與同進(jìn)程中的其他線程共享數(shù)據(jù),但擁有自己的棧空間,擁有獨(dú)立的執(zhí)行序列。
3.區(qū)別
進(jìn)程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進(jìn)程有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其它進(jìn)程產(chǎn)生影響。
而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒(méi)有單獨(dú)的地址空間,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,
所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時(shí),耗費(fèi)資源較大,效率要差一些。
但對(duì)于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進(jìn)程。
1) 簡(jiǎn)而言之,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程.
2) 線程的劃分尺度小于進(jìn)程,使得多線程程序的并發(fā)性高。
3) 另外,進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率。
4) 線程在執(zhí)行過(guò)程中與進(jìn)程還是有區(qū)別的。每個(gè)獨(dú)立的線程有一個(gè)程序運(yùn)行的入口、順序執(zhí)行序列和程序的出口。
? ?但是線程不能夠獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制。
5) 從邏輯角度來(lái)看,多線程的意義在于一個(gè)應(yīng)用程序中,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行。
? ?但操作系統(tǒng)并沒(méi)有將多個(gè)線程看做多個(gè)獨(dú)立的應(yīng)用,來(lái)實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。這就是進(jìn)程和線程的重要區(qū)別。
4.優(yōu)缺點(diǎn)
線程和進(jìn)程在使用上各有優(yōu)缺點(diǎn):
線程執(zhí)行開(kāi)銷小,但不利于資源的管理和保護(hù);而進(jìn)程正相反。
Why:?
由于CPU與其他PC資源之間速度的不協(xié)調(diào),人們想提高資源利用率,所以人們提出了多任務(wù)系統(tǒng)。
得益于CPU的計(jì)算速度,我們可以“同時(shí)”運(yùn)行多個(gè)任務(wù),實(shí)質(zhì)上是多個(gè)任務(wù)之間輪流使用CPU資源,由于速度超快,給用戶的感覺(jué)就是連續(xù)的。
How:?
1)任務(wù)的執(zhí)行需要依賴各個(gè)PC資源,我們可以稱為計(jì)算機(jī)執(zhí)行的上下文環(huán)境。
? ?要實(shí)現(xiàn)“同時(shí)執(zhí)行”,就需要不斷輪換,為了后來(lái)繼續(xù)從當(dāng)前狀態(tài)執(zhí)行下去,計(jì)算機(jī)需要保存切換前的程序上下文。
? ?所以有了進(jìn)程:用進(jìn)程去描述程序當(dāng)前上下文的狀態(tài)信息----內(nèi)存位置、變量值、任務(wù)ID……所以,進(jìn)程是資源分配的單位。
? ?一般來(lái)說(shuō)宏觀上可以看做是一個(gè)軟件的運(yùn)行,例如一個(gè)word文檔的打開(kāi)。
2)多個(gè)任務(wù)之間切換因?yàn)橐4嫔舷挛摹⒄{(diào)入上下文,一旦多了的時(shí)候,還是有一定的時(shí)間消耗的。
? ?為了進(jìn)一步提高資源利用率,人們?cè)谶M(jìn)程中,引入了線程,線程只是CPU輪流調(diào)度的單位,其他上下文信息用所在進(jìn)程中的。
? ?這樣上下文切換的耗時(shí)就降了下來(lái)。同樣的,宏觀上來(lái)可以看做是一個(gè)軟件中的多個(gè)處理功能,例如上述打開(kāi)word中拼寫(xiě)檢查功能、字體加粗……
So, What:?
一般來(lái)說(shuō),進(jìn)程是資源的分配單位,線程是CPU在進(jìn)程內(nèi)切換的單位,線程屬于進(jìn)程。所以運(yùn)行某個(gè)軟件,相當(dāng)于開(kāi)了一個(gè)進(jìn)程。
在這個(gè)軟件運(yùn)行的過(guò)程里(在這個(gè)進(jìn)程里),多個(gè)工作支撐的完成QQ的運(yùn)行,那么這“多個(gè)工作”分別有一個(gè)線程。
再打一個(gè)通俗易懂的比方吧!
比如你去一個(gè)食堂吃飯。里面有A,B,C,D等一些窗口可以打飯菜或者米粉麻辣燙什么的。
但是每一個(gè)窗口又有打這些菜的師傅。
那么這些窗口就是進(jìn)程。
那個(gè)那些窗口里面打菜的師傅就是線程。
這個(gè)食堂就是系統(tǒng)了,系統(tǒng)去分配這些進(jìn)程。 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
通常請(qǐng)求一個(gè)URL耗時(shí)要幾百毫秒到幾秒不等,而我們的CPU處理速度驚人,兩者的速度就好比烏龜跟火箭的差別。
在單線程同步阻塞程序中,如果要獲取一個(gè)網(wǎng)站所有的URL,假設(shè)100個(gè)URL,平均每個(gè)URL請(qǐng)求的時(shí)間是1秒,
那么在單線程同步場(chǎng)景下,最快也需要100秒鐘,才能把所有的頁(yè)面爬取下來(lái)。
于是,我們想到了更好的一種辦法就是采用多線程或者多進(jìn)程,但是由于在Python中臭名昭著的GIL,導(dǎo)致做不到真正的并行運(yùn)算,
在同一時(shí)間內(nèi),就算有多核CPU,也無(wú)法被利用起來(lái),這樣雖然能做到并發(fā),但是沒(méi)法并行,在單個(gè)CPU里切換線程,還有切換成本,以及線程的創(chuàng)造成本。
如果使用多進(jìn)程,雖然能利用多核處理的優(yōu)勢(shì),但是多進(jìn)程的創(chuàng)建成本比線程更高,而IO密集型任務(wù),CPU不是瓶頸。
所以,后來(lái)Python引入了異步編程,異步編程使得CPU不再需要再去等待耗時(shí)的操作,而是讓出CPU時(shí)間給其他任務(wù)執(zhí)行,
這樣假如有100個(gè)任務(wù),每個(gè)任務(wù)是1秒鐘,就可以做到理論上只需要1秒鐘就可以完成所有的任務(wù)。
同步與異步
異步操作的本質(zhì)
所有的程序最終都會(huì)由計(jì)算機(jī)硬件來(lái)執(zhí)行,所以為了更好的理解異步操作的本質(zhì),我們有必要了解一下它的硬件基礎(chǔ)。?熟悉電腦硬件的朋友肯定對(duì)DMA這個(gè)詞不陌生,硬盤、光驅(qū)的技術(shù)規(guī)格中都有明確DMA的模式指標(biāo),其實(shí)網(wǎng)卡、聲卡、顯卡也是有DMA功能的。
DMA就是直接內(nèi)存訪問(wèn)的意思,也就是說(shuō),擁有DMA功能的硬件在和內(nèi)存進(jìn)行數(shù)據(jù)交換的時(shí)候可以不消耗CPU資源。
只要CPU在發(fā)起數(shù)據(jù)傳輸時(shí)發(fā)送一個(gè)指令,硬件就開(kāi)始自己和內(nèi)存交換數(shù)據(jù),在傳輸完成之后硬件會(huì)觸發(fā)一個(gè)中斷來(lái)通知操作完成。
這些無(wú)須消耗CPU時(shí)間的I/O操作正是異步操作的硬件基礎(chǔ)。所以即使在DOS這樣的單進(jìn)程(而且無(wú)線程概念)系統(tǒng)中也同樣可以發(fā)起異步的DMA操作。
同步和異步關(guān)注的是消息通信機(jī)制 (synchronous communication/ asynchronous communication)
所謂同步,就是在發(fā)出一個(gè)*調(diào)用*時(shí),在沒(méi)有得到結(jié)果之前,該*調(diào)用*就不返回。但是一旦調(diào)用返回,就得到返回值了。換句話說(shuō),就是由*調(diào)用者*主動(dòng)等待這個(gè)*調(diào)用*的結(jié)果。而異步則是相反,*調(diào)用*在發(fā)出之后,這個(gè)調(diào)用就直接返回了,所以沒(méi)有返回結(jié)果。換句話說(shuō),當(dāng)一個(gè)異步過(guò)程調(diào)用發(fā)出后,調(diào)用者不會(huì)立刻得到結(jié)果。
而是在*調(diào)用*發(fā)出后,*被調(diào)用者*通過(guò)狀態(tài)、通知來(lái)通知調(diào)用者,或通過(guò)回調(diào)函數(shù)處理這個(gè)調(diào)用。典型的異步編程模型比如Node.js
舉個(gè)通俗的例子:
你打電話問(wèn)書(shū)店老板有沒(méi)有《分布式系統(tǒng)》這本書(shū),如果是同步通信機(jī)制,書(shū)店老板會(huì)說(shuō),你稍等,”我查一下",然后開(kāi)始查啊查,等查好了(可能是5秒,也可能是一天)告訴你結(jié)果(返回結(jié)果)。
而異步通信機(jī)制,書(shū)店老板直接告訴你我查一下啊,查好了打電話給你,然后直接掛電話了(不返回結(jié)果)。然后查好了,他會(huì)主動(dòng)打電話給你。在這里老板通過(guò)“回電”這種方式來(lái)回調(diào)。
阻塞與非阻塞
阻塞和非阻塞關(guān)注的是程序在等待調(diào)用結(jié)果(消息,返回值)時(shí)的狀態(tài)。阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會(huì)被掛起。調(diào)用線程只有在得到結(jié)果之后才會(huì)返回。
非阻塞調(diào)用指在不能立刻得到結(jié)果之前,該調(diào)用不會(huì)阻塞當(dāng)前線程。
還是上面的例子,
你打電話問(wèn)書(shū)店老板有沒(méi)有《分布式系統(tǒng)》這本書(shū),你如果是阻塞式調(diào)用,你會(huì)一直把自己“掛起”,直到得到這本書(shū)有沒(méi)有的結(jié)果,
如果是非阻塞式調(diào)用,你不管老板有沒(méi)有告訴你,你自己先一邊去玩了, 當(dāng)然你也要偶爾過(guò)幾分鐘check一下老板有沒(méi)有返回結(jié)果。
在這里阻塞與非阻塞與是否同步異步無(wú)關(guān)。跟老板通過(guò)什么方式回答你結(jié)果無(wú)關(guān)。
進(jìn)程和線程的區(qū)別
1.定義進(jìn)程:具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位.
線程:進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位。
線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),
但是它可與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源.
2.關(guān)系
一個(gè)線程可以創(chuàng)建和撤銷另一個(gè)線程;同一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行.
相對(duì)進(jìn)程而言,線程是一個(gè)更加接近于執(zhí)行體的概念,它可以與同進(jìn)程中的其他線程共享數(shù)據(jù),但擁有自己的棧空間,擁有獨(dú)立的執(zhí)行序列。
3.區(qū)別
進(jìn)程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進(jìn)程有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其它進(jìn)程產(chǎn)生影響。
而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒(méi)有單獨(dú)的地址空間,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,
所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時(shí),耗費(fèi)資源較大,效率要差一些。
但對(duì)于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進(jìn)程。
1) 簡(jiǎn)而言之,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程.
2) 線程的劃分尺度小于進(jìn)程,使得多線程程序的并發(fā)性高。
3) 另外,進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率。
4) 線程在執(zhí)行過(guò)程中與進(jìn)程還是有區(qū)別的。每個(gè)獨(dú)立的線程有一個(gè)程序運(yùn)行的入口、順序執(zhí)行序列和程序的出口。
? ?但是線程不能夠獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制。
5) 從邏輯角度來(lái)看,多線程的意義在于一個(gè)應(yīng)用程序中,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行。
? ?但操作系統(tǒng)并沒(méi)有將多個(gè)線程看做多個(gè)獨(dú)立的應(yīng)用,來(lái)實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。這就是進(jìn)程和線程的重要區(qū)別。
4.優(yōu)缺點(diǎn)
線程和進(jìn)程在使用上各有優(yōu)缺點(diǎn):
線程執(zhí)行開(kāi)銷小,但不利于資源的管理和保護(hù);而進(jìn)程正相反。
舉例
開(kāi)個(gè)QQ,開(kāi)了一個(gè)進(jìn)程;開(kāi)了迅雷,開(kāi)了一個(gè)進(jìn)程。在QQ的這個(gè)進(jìn)程里,傳輸文字開(kāi)一個(gè)線程、傳輸語(yǔ)音開(kāi)了一個(gè)線程、彈出對(duì)話框又開(kāi)了一個(gè)線程。Why:?
由于CPU與其他PC資源之間速度的不協(xié)調(diào),人們想提高資源利用率,所以人們提出了多任務(wù)系統(tǒng)。
得益于CPU的計(jì)算速度,我們可以“同時(shí)”運(yùn)行多個(gè)任務(wù),實(shí)質(zhì)上是多個(gè)任務(wù)之間輪流使用CPU資源,由于速度超快,給用戶的感覺(jué)就是連續(xù)的。
How:?
1)任務(wù)的執(zhí)行需要依賴各個(gè)PC資源,我們可以稱為計(jì)算機(jī)執(zhí)行的上下文環(huán)境。
? ?要實(shí)現(xiàn)“同時(shí)執(zhí)行”,就需要不斷輪換,為了后來(lái)繼續(xù)從當(dāng)前狀態(tài)執(zhí)行下去,計(jì)算機(jī)需要保存切換前的程序上下文。
? ?所以有了進(jìn)程:用進(jìn)程去描述程序當(dāng)前上下文的狀態(tài)信息----內(nèi)存位置、變量值、任務(wù)ID……所以,進(jìn)程是資源分配的單位。
? ?一般來(lái)說(shuō)宏觀上可以看做是一個(gè)軟件的運(yùn)行,例如一個(gè)word文檔的打開(kāi)。
2)多個(gè)任務(wù)之間切換因?yàn)橐4嫔舷挛摹⒄{(diào)入上下文,一旦多了的時(shí)候,還是有一定的時(shí)間消耗的。
? ?為了進(jìn)一步提高資源利用率,人們?cè)谶M(jìn)程中,引入了線程,線程只是CPU輪流調(diào)度的單位,其他上下文信息用所在進(jìn)程中的。
? ?這樣上下文切換的耗時(shí)就降了下來(lái)。同樣的,宏觀上來(lái)可以看做是一個(gè)軟件中的多個(gè)處理功能,例如上述打開(kāi)word中拼寫(xiě)檢查功能、字體加粗……
So, What:?
一般來(lái)說(shuō),進(jìn)程是資源的分配單位,線程是CPU在進(jìn)程內(nèi)切換的單位,線程屬于進(jìn)程。所以運(yùn)行某個(gè)軟件,相當(dāng)于開(kāi)了一個(gè)進(jìn)程。
在這個(gè)軟件運(yùn)行的過(guò)程里(在這個(gè)進(jìn)程里),多個(gè)工作支撐的完成QQ的運(yùn)行,那么這“多個(gè)工作”分別有一個(gè)線程。
再打一個(gè)通俗易懂的比方吧!
比如你去一個(gè)食堂吃飯。里面有A,B,C,D等一些窗口可以打飯菜或者米粉麻辣燙什么的。
但是每一個(gè)窗口又有打這些菜的師傅。
那么這些窗口就是進(jìn)程。
那個(gè)那些窗口里面打菜的師傅就是線程。
這個(gè)食堂就是系統(tǒng)了,系統(tǒng)去分配這些進(jìn)程。 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
總結(jié)
以上是生活随笔為你收集整理的同步与异步以及线程与进程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Jmeter BeanShell取样器操
- 下一篇: php小程序onload,微信小程序 l