單線程并發(fā)
單線程并發(fā),并非真正意義上的單線程。而是只有單一的用戶線程。還包括數(shù)據(jù)庫,socket等系統(tǒng)多線程。
單個(gè)用戶線程:對于十萬個(gè)用戶同時(shí)訪問服務(wù)器,有兩種方式處理并發(fā)。
-
為每個(gè)用戶開一個(gè)新的用戶線程,每個(gè)線程內(nèi)部采用阻塞通信的方式,即同步通信,從數(shù)據(jù)庫中取數(shù)據(jù)、與服務(wù)器通信等,直到得到結(jié)果,返回給用戶。其中涉及多個(gè)用戶線程。
-
只有一個(gè)用戶線程,采用非阻塞通信的方式,即異步通信,通過事件驅(qū)動的方式實(shí)現(xiàn)并發(fā)。從數(shù)據(jù)庫中取數(shù)據(jù)、與服務(wù)器通信或與其他進(jìn)程通信,并不會阻塞線程的執(zhí)行,每次數(shù)據(jù)獲取完畢,通過事件的方式,調(diào)用用戶進(jìn)程,處理得到的數(shù)據(jù),返回給用戶。其中,只有一個(gè)用戶進(jìn)程。
-
對于事件驅(qū)動的方法:會存在一個(gè)事件隊(duì)列,唯一的用戶進(jìn)程會不斷地依次處理隊(duì)列中的事件。所以不會存在沖突。有兩種處理事件的方法:基于監(jiān)聽器的事件處理機(jī)制和基于回調(diào)的事件處理機(jī)制。
常見的線程通信:與服務(wù)器進(jìn)行通信socket,與數(shù)據(jù)庫進(jìn)行通信、與文件讀寫進(jìn)程進(jìn)行通信。
前者通過擴(kuò)展空間的方式,后者通過縮短時(shí)間的方式。更快速地執(zhí)行操作。
2 同步與異步 阻塞與非阻塞
-
老張把水壺放到火上,立等水開。(同步阻塞)老張覺得自己有點(diǎn)傻
-
老張把水壺放到火上,去客廳看電視,時(shí)不時(shí)去廚房看看水開沒有。(同步非阻塞)老張還是覺得自己有點(diǎn)傻,于是變高端了,買了把會響笛的那種水壺。水開之后,能大聲發(fā)出嘀~~~~的噪音。
-
老張把響水壺放到火上,立等水開。(異步阻塞)老張覺得這樣傻等意義不大
-
老張把響水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(異步非阻塞)
多線程同步阻塞。
單線程異步非阻塞:通過事件響應(yīng)機(jī)制,包括監(jiān)聽器和回調(diào)兩種方法,實(shí)現(xiàn)單線程,異步非阻塞。
this指針
this關(guān)鍵字指向的是當(dāng)前對象的引用
this 不是指向類。而是在實(shí)例化的時(shí)候與當(dāng)前類的實(shí)例也就是對象,進(jìn)行綁定。
關(guān)于回調(diào)
對于Python與JavaScript這種,能夠直接傳遞“函數(shù)類型”的參數(shù)的語言,回調(diào)函數(shù)可以作為另外一個(gè)函數(shù)的參數(shù),進(jìn)行傳遞。
在C++和java這種只能傳遞基本數(shù)據(jù)類型和構(gòu)造數(shù)據(jù)類型的語言中,即函數(shù)不作為數(shù)據(jù)類型的語言中,可以通過傳遞整個(gè)對象的方法,使得被調(diào)用者,能夠通過調(diào)用者對象的指針,進(jìn)行回調(diào),這也是設(shè)計(jì)模式的一種。(觀察者模式?)
關(guān)于回調(diào)函數(shù)的本質(zhì)理解:當(dāng)其他程序執(zhí)行時(shí),能夠通過回調(diào)函數(shù),轉(zhuǎn)移進(jìn)程控制權(quán)限,給調(diào)用者。可以把調(diào)用者與被調(diào)用者分開。調(diào)用者能夠顯式調(diào)用被調(diào)用者,同時(shí)被調(diào)用這能通過回調(diào)函數(shù)隱式調(diào)用調(diào)用者。
關(guān)于回調(diào)函數(shù)的本質(zhì)理解:回調(diào)函數(shù)在同一個(gè)層次內(nèi)是沒有用的,或者說沒有必要的。如果一個(gè)人,在實(shí)現(xiàn)一個(gè)層次內(nèi)部的函數(shù)執(zhí)行權(quán)限轉(zhuǎn)移過程中,可以直接進(jìn)行相互調(diào)用,因?yàn)楸举|(zhì)上,兩個(gè)部分是完全可知的。但是在不同層次的調(diào)用中,例如用戶層與系統(tǒng)層中,用戶層調(diào)用系統(tǒng)層,可以通過顯式調(diào)用,但是系統(tǒng)層并不會考慮用戶層的具體實(shí)現(xiàn),對用戶層是不可知的。這個(gè)時(shí)候,系統(tǒng)層會通過傳遞來的回調(diào)函數(shù),將進(jìn)程控制權(quán)交給用戶層。
那么問題來了,直接通過返回值的方式轉(zhuǎn)移進(jìn)程的控制權(quán)限不好嗎。在回調(diào)的部分通過返回值,區(qū)分不同的情況,用戶自己選擇執(zhí)行什么樣的函數(shù)。
首先允許我,在這里將程序簡單地分為用戶層和系統(tǒng)層。用戶層就是程序員編寫的代碼,系統(tǒng)層就是程序語言提供的外部庫、框架、工具等。
關(guān)于回調(diào)函數(shù)的本質(zhì)理解:回調(diào)函數(shù)在單線程的編程中也有一定的作用。在之前的疑問中,用戶根據(jù)返回值調(diào)用不同的函數(shù)與系統(tǒng)調(diào)用回調(diào)函數(shù)與系統(tǒng)通過回調(diào)函數(shù)調(diào)用用戶程序,后者,當(dāng)回調(diào)程序執(zhí)行完成后控制權(quán)依舊交給系統(tǒng),不必考慮,系統(tǒng)在什么地方中斷。在這里涉及一個(gè)關(guān)鍵的問題,到底是用戶具有主動權(quán)還是系統(tǒng)具有主動權(quán)。在架構(gòu)設(shè)計(jì)中有一個(gè)很關(guān)鍵的問題,系統(tǒng)應(yīng)該提供大量的類、方法等工具,幫助用戶實(shí)現(xiàn)一個(gè)完成的程序,還是系統(tǒng)應(yīng)該實(shí)現(xiàn)主體的程序,在特定情況下調(diào)用用戶的程序?qū)崿F(xiàn)局部功能?
關(guān)于這個(gè)問題的討論,我想應(yīng)該牽扯到系統(tǒng)架構(gòu)相關(guān)的很多知識,我覺得有空多讀點(diǎn)專業(yè)類的書籍還是很有幫助的。理論書籍。要遠(yuǎn)比自己單純的了解技術(shù)和知識好的多。
我想關(guān)于上邊的問題,應(yīng)該可以非常好的區(qū)分編程框架與庫的區(qū)別。比如jQuery就是編程庫,它提供了功能。springboot是編程框架,它提供了主體流程,用戶只要實(shí)現(xiàn)少量的自定義模塊,而不需要管理程序的一級一級調(diào)用過程。
簡單來說,用戶只要通過少量的注解,就能將自己的類注冊到spring框架當(dāng)中,用戶完成的知識其中的一笑部分補(bǔ)充代碼。
簡單舉例,假如我想要設(shè)計(jì)一個(gè)編程框架,這個(gè)框架是想要提供可以復(fù)用的功能,還是想完成主要的流程呢?
我之前覺得仿真程序的開發(fā),不好的原因是擴(kuò)展性、可讀性、重用性都十分差,所以,從工程的角度來說,這些代碼確實(shí)需要重構(gòu)。
那么通過什么樣的方式實(shí)現(xiàn)代碼重構(gòu)呢?最終的要的辦法是實(shí)現(xiàn)模塊化,將所有的功能模塊化,并提供統(tǒng)一的標(biāo)準(zhǔn)接口,規(guī)范命名等。
另一個(gè)很重要的內(nèi)容,是構(gòu)建新的編程框架。使每一個(gè)開發(fā)人員都專注于搞算法和邏輯,而不是在無休止的重復(fù)嘗試。寫一堆無用的重復(fù)的邏輯代碼。文章來源:http://www.zghlxwxcb.cn/news/detail-603550.html
模塊化,提供編程的API,實(shí)現(xiàn)各種可以重復(fù)使用的功能。 編程框架,編程模型,實(shí)現(xiàn)主要的業(yè)務(wù)流程,作為系統(tǒng)層,用戶通過注入的方式,將自己身構(gòu)建的代碼添加到系統(tǒng)流程中。系統(tǒng)通過回調(diào)的方式,實(shí)現(xiàn)特殊情況的處理。文章來源地址http://www.zghlxwxcb.cn/news/detail-603550.html
到了這里,關(guān)于線程、并發(fā)、多線程并發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!