使用Scala Actor時(shí)最差(或最好的)編程習(xí)慣?
原創(chuàng)【51CTO快譯】前日,在stackoverflow上有一則關(guān)于Scala Actor的問(wèn)題,很有代表性。該問(wèn)題的答案對(duì)于學(xué)習(xí)Scala Actor的開(kāi)發(fā)者會(huì)有一些幫助。這個(gè)問(wèn)題是:
在使用Scala Actors的時(shí)候有哪些最差的使用習(xí)慣?
(如果還沒(méi)有執(zhí)行最好編程習(xí)慣的自信,那么先注重回避最差的習(xí)慣倒不失為一個(gè)很好的想法。不過(guò)事實(shí)上下面這些答案中已經(jīng)在建議一些優(yōu)良的使用習(xí)慣了。)
51CTO編輯推薦:Scala編程語(yǔ)言專(zhuān)題
下面是一份不錯(cuò)的答案(譯文):
◆任何地方都不要使用!?,否則會(huì)造成系統(tǒng)鎖定。
◆總是從actor類(lèi)子系統(tǒng)線(xiàn)程發(fā)送消息。如果這意味著要通過(guò)actor.actor方法創(chuàng)造一個(gè)暫時(shí)的actor類(lèi),那么代碼如下:
- case ButtonClicked(src) => Actor.actor { controller ! SaveTrade(trdFld.text) }
◆給你的actor的反應(yīng)(reactions)加一個(gè)“其它消息”處理程序。否則就不可能判斷你是否在給一個(gè)錯(cuò)誤的actor類(lèi)發(fā)送消息:
- case other => log.warning(this + " has received unexpected message " + other
◆對(duì)于你的原始actor類(lèi),不要使用actor.actor方法,而是用actor類(lèi)的子類(lèi)(subclass)。這么做的原因是只有通過(guò)子類(lèi)你才能提供一個(gè)敏感toString方法。還有,如果你的日志中到處都有像下面的聲明的話(huà),調(diào)試actor類(lèi)將非常的困難:
- 12:03 [INFO] Sending RequestTrades(2009-10-12) to scala.actors.Actor$anonfun$1
◆把你系統(tǒng)中的actor類(lèi)整理成文檔,并明確注明它們接受什么消息,以及它們?cè)趺淳_的計(jì)算響應(yīng)。使用actor類(lèi)會(huì)導(dǎo)致標(biāo)準(zhǔn)程序(一般是用一個(gè)方法壓縮)通過(guò)多個(gè)actor類(lèi)之間的響應(yīng)變成一個(gè)復(fù)雜的邏輯網(wǎng)絡(luò)。沒(méi)有好的文檔管理很容易搞混。
◆保證你可以跟你的actor類(lèi)在響應(yīng)循環(huán)之外進(jìn)行通信,從而確定它的狀態(tài)。舉個(gè)例子,我總是聲明一個(gè)方法,使用一個(gè)和下面的編碼類(lèi)似的MBean調(diào)用。否則,很難看出你的actor類(lèi)是在運(yùn)行,還是已經(jīng)關(guān)掉,是否有一大長(zhǎng)串消息等等。
- def reportState = {
- val _this = this
- synchronized {
- val msg = "%s Received request to report state with %d items in mailbox".format(
- _this, mailboxSize)
- log.info(msg)
- }
- Actor.actor { _this ! ReportState }
- }
◆把你的actors連在一起并把trapExit設(shè)置成true,否則它們會(huì)悄無(wú)聲息的失敗,這意味著你的程序不會(huì)按你所設(shè)計(jì)的執(zhí)行,并且當(dāng)消息留在actor的郵箱里時(shí)程序會(huì)溢出存儲(chǔ)器。
對(duì)于以上這些Scala Actors的使用建議,你有什么看法么?
【編輯推薦】


















