日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Akka框架——第一节:并发编程简介

發(fā)布時(shí)間:2024/1/23 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Akka框架——第一节:并发编程简介 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本節(jié)主要內(nèi)容:
1. 重要概念
2. Actor模型
3. Akka架構(gòu)簡(jiǎn)介

多核處理器的出現(xiàn)使并發(fā)編程(Concurrent Programming)成為開(kāi)發(fā)人員必備的一項(xiàng)技能,許多現(xiàn)代編程語(yǔ)言都致力于解決并發(fā)編程問(wèn)題。并發(fā)編程雖然能夠提高程序的性能,但傳統(tǒng)并發(fā)編程的共享內(nèi)存通信機(jī)制對(duì)開(kāi)發(fā)人員的編程技能要求很高,需要開(kāi)發(fā)人員通過(guò)自身的專業(yè)編程技能去避免死鎖、互斥等待及競(jìng)爭(zhēng)條件(Race Condition)等,熟悉Java語(yǔ)言并發(fā)編程的讀者們對(duì)這些問(wèn)題的理解會(huì)比較深刻,這些問(wèn)題使得并發(fā)編程比順序編程要困難得多。
Scala語(yǔ)言并沒(méi)有直接使用Java語(yǔ)言提供的并發(fā)編程庫(kù),而是通過(guò)Actor模型來(lái)解決Java并發(fā)編程中遇到的各種問(wèn)題,為并發(fā)編程提供了更高級(jí)的抽象。
1 重要概念
(1)并發(fā)和并行
并發(fā)和并行從宏觀來(lái)看,都是為進(jìn)行多任務(wù)運(yùn)行,但并發(fā)(Concurrency)和并行(parallelism)兩者之間是有區(qū)別的。并行是指兩個(gè)或者兩個(gè)以上任務(wù)在同一時(shí)刻同時(shí)運(yùn)行,;而并發(fā)是指兩個(gè)或兩個(gè)以上的任務(wù)在同一時(shí)間段內(nèi)運(yùn)行,即一個(gè)時(shí)間段中有幾個(gè)任務(wù)都處于已啟動(dòng)運(yùn)行到運(yùn)行完畢之間,這若干任務(wù)在同一CPU上運(yùn)行但任一個(gè)時(shí)刻點(diǎn)上只有一個(gè)任務(wù)運(yùn)行。圖121給出了多核處理器下的現(xiàn)代操作系統(tǒng)進(jìn)程和線程模型,圖中進(jìn)程2的線程1被調(diào)用度到處理器的核2上運(yùn)行、進(jìn)程3的線程1被調(diào)度到處理器的核3上運(yùn)行,進(jìn)程2的線程1和進(jìn)程3的線程1是并行的,它們可以同時(shí)運(yùn)行,而進(jìn)程1的線程1和線程2都調(diào)度到處理器的核1上運(yùn)行,此外它們還共享線程1的內(nèi)存空間,在運(yùn)行時(shí)面臨著資源競(jìng)爭(zhēng)包括CPU、內(nèi)存及其它如IO等,它們?cè)谕粫r(shí)候只能運(yùn)行一個(gè),但在一段時(shí)間內(nèi)都可以運(yùn)行,因此進(jìn)程1的線程1和線程2是并發(fā)執(zhí)行的。

圖1 進(jìn)程、線程模型
(2)橫向擴(kuò)展和縱向擴(kuò)展
所謂縱向擴(kuò)展(Scale Up)指的是增加程序的進(jìn)度或線程數(shù)量,提高程序的并發(fā)性;而橫向擴(kuò)展(Scale Out)指的是程序可以擴(kuò)展到其它機(jī)器上運(yùn)行,即通過(guò)分布式系統(tǒng)來(lái)提到程序的并行度。傳統(tǒng)的Java并發(fā)編程模型不容易進(jìn)行縱向擴(kuò)展,因此并發(fā)的線程數(shù)越多,程序行為便會(huì)變得很難理解和控制,更多的線程加入到資源競(jìng)爭(zhēng),出現(xiàn)死鎖等情況的概率增加。橫向擴(kuò)展比縱向擴(kuò)展困難更大,此時(shí)的程序變?yōu)榉植际江h(huán)境下的應(yīng)用,情況更為復(fù)雜,對(duì)開(kāi)發(fā)人員的要求更高。scala提供的Actor模型可以解決并發(fā)應(yīng)用程序的橫向擴(kuò)展和縱向擴(kuò)展問(wèn)題,如圖2、圖3給出了基本Actor模型的橫向擴(kuò)展和縱向擴(kuò)展。

圖2 縱向擴(kuò)展

圖3 橫向擴(kuò)展

2 Actor模型
在使用Java語(yǔ)言進(jìn)行并發(fā)編程時(shí),需要特別關(guān)注共享的數(shù)據(jù)結(jié)構(gòu),線程間的資源競(jìng)爭(zhēng)容易導(dǎo)致死鎖等問(wèn)題,而Actor模型便是要解決線程和鎖帶來(lái)的問(wèn)題,Actor是一種基于事件(Event-Based)的輕量級(jí)線程,在使用Actor進(jìn)行并發(fā)編程時(shí)只需要關(guān)注代碼結(jié)構(gòu),而不需要過(guò)分關(guān)注數(shù)據(jù)結(jié)構(gòu),因此Actor最大限度地減少了數(shù)據(jù)的共享。 Actor由三個(gè)重要部分組成,它們是狀態(tài)(state),行為(Behavior)和郵箱(Mailbox),Actor與Actor之間的交互通過(guò)消息發(fā)送來(lái)完成,Actor模型如圖4所示,狀態(tài)指的是Actor對(duì)象的變量信息,它可以是Actor對(duì)象中的局部變量、占用的機(jī)器資源等,狀態(tài)只會(huì)根據(jù)Actor接受的消息而改變,從而避免并發(fā)環(huán)境下的死鎖等問(wèn)題;行為指的是Actor的計(jì)算行為邏輯,它通過(guò)處理Actor接收的消息而改變Actor狀態(tài);郵箱(mailbox)建立起Actor間的連接,即Actor發(fā)送消息后,另外一個(gè)Actor將接收的消息放入到郵箱中待后期處理,郵箱的內(nèi)部實(shí)現(xiàn)是通過(guò)隊(duì)列來(lái)實(shí)現(xiàn)的,隊(duì)列可以是有界的(Bounded)也可以是無(wú)界的(Unbounded),有界隊(duì)列實(shí)現(xiàn)的郵箱容量固定,無(wú)界隊(duì)列實(shí)現(xiàn)的郵箱容易不受限制。

圖4 Actor模型
不難看出,Actor模型是對(duì)現(xiàn)實(shí)世界的高度抽象,它具有如下特點(diǎn):(1)Actor之間使用消息傳遞機(jī)制進(jìn)行通信,傳遞的消息使用的是不可變消息,Actor之間并不共享數(shù)據(jù)結(jié)構(gòu),如果有數(shù)據(jù)共享則通過(guò)消息發(fā)送的方式進(jìn)行;(2) 各Actor都有對(duì)應(yīng)的mailbox,如果其它Actor向該Actor發(fā)送消息,消息將入隊(duì)待后期處理;(3)Actor間的消息傳遞通過(guò)異步的方式進(jìn)行,即消息的發(fā)送者發(fā)送完消息后不必等待回應(yīng)便可以返回繼承處理其它任務(wù)。

3 Akka并發(fā)編程框架
Scala語(yǔ)言中原生地支持Actor模型,只不過(guò)功能還不夠強(qiáng)大,從Scala 2.10版本之后,Akka框架成為Scala包的一部分,可以在程序中直接使用。Akka框架作為Akka是一個(gè)以Actor模型為基礎(chǔ)構(gòu)建的基于事件的并發(fā)編程框架,底層使用Scala語(yǔ)言實(shí)現(xiàn),提供Java和Scala兩種API,它屬于LightBend公司(原Typesafe公司)體系結(jié)構(gòu)的一部分,如圖5所示。

圖5 Lightbend 體系結(jié)構(gòu)[ ]
Akka框架意在簡(jiǎn)化高并發(fā)、可擴(kuò)展及分布式應(yīng)用程序的設(shè)計(jì),它具有如下優(yōu)勢(shì):
(1) 使用Akka框架編寫的應(yīng)用程序既可以橫向擴(kuò)展(Scale Out)、也可縱向擴(kuò)展(Scale Up)。
(2) 編寫并發(fā)應(yīng)用程序更簡(jiǎn)單,Akka提供了更高的抽象,開(kāi)發(fā)人員只需要專注于業(yè)務(wù)邏輯,而無(wú)需像Java語(yǔ)言那樣需要處理底級(jí)語(yǔ)義如線程、鎖及非阻塞IO等。
(3) 高容錯(cuò),Akka使用“l(fā)et it crashes”機(jī)制,當(dāng)Actor出錯(cuò)時(shí)可以快速恢復(fù)。
(4) 事件驅(qū)動(dòng)的架構(gòu),Akka中的Actor之間的通信采用異步消息發(fā)送,能夠完美支持事件驅(qū)動(dòng)。
(5) 位置透明,無(wú)論是Actor運(yùn)行在本地機(jī)器還是遠(yuǎn)程機(jī)器上,對(duì)于用戶來(lái)說(shuō)都是透明的,這極大地簡(jiǎn)化了多核處理器和分布式系統(tǒng)上的應(yīng)用程序編程。
(6) 事務(wù)支持能力,支持軟件事務(wù)內(nèi)存(software transactional memory,STM),使Actor具有原子消息流的操作能力。
Akka框架由下列十個(gè)組件構(gòu)成:
(1) akka-actor :包括經(jīng)典的Actor、Typed Actors、IO Actor等
(2) akka-remote:遠(yuǎn)程Actor
(3) akka-testkit:測(cè)試Actor系統(tǒng)的工具箱
(4) akka-kernel :Akka微內(nèi)核,用于運(yùn)行精簡(jiǎn)的微型應(yīng)用程序服務(wù)器,無(wú)需運(yùn)行于Java應(yīng)用服務(wù)器上。
(5) akka-transactor :Transactors 即支持事務(wù)的 actors,集成了Scala STM
(6) akka-agent – 代理, 同樣集成了Scala STM
(7) akka-camel – 集成Apache Camel
(8) akka-zeromq – 集成ZeroMQ 消息隊(duì)列
(9) akka-slf4j – 支持SLF4J 日志功能
(10) akka-filebased-mailbox – 支持基于文件的mailbox

總結(jié)

以上是生活随笔為你收集整理的Akka框架——第一节:并发编程简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。