stage語言的并發(fā)設(shè)計

最早的計算機(jī)是非實(shí)時的,編制好順序任務(wù),計算機(jī)一件一件執(zhí)行,

然后在任務(wù)里,為了處理等待IO等操作,提供了異步IO指令,讓CPU在IO階段可以同時處理計算,

后來出現(xiàn)了分時操作系統(tǒng),計算機(jī)有了進(jìn)程概念,任務(wù)間互無關(guān)系,操作系統(tǒng)可以連接多終端(用戶接口)的交互,

接著人們希望在單任務(wù)里,密集計算不影響用戶界面(UI)交互,于是有了線程,

接著CPU出現(xiàn)了多核,多進(jìn)程可以成倍地加快程序性能,

在互聯(lián)網(wǎng)的時代,為了完成一項(xiàng)任務(wù),我們可以用到互聯(lián)網(wǎng)上的所有計算資源,

操作系統(tǒng)提供了異步API,線程API,較為現(xiàn)代的編程語言則提供了協(xié)程設(shè)施,
協(xié)程可以看作是“用戶級別的線程”,它配合異步API,和線程API,更加靈活地使用并發(fā)資源,有些語言,比如golang,內(nèi)建了對進(jìn)程內(nèi)并發(fā)的支持,kotlin則使用語言支持+庫的方式細(xì)粒度地構(gòu)建并發(fā),

如果我們把云環(huán)境看做是"互聯(lián)網(wǎng)操作系統(tǒng)",我相信未來需要一種在這樣操作系統(tǒng)下成熟的編程語言,它對于各種并發(fā)(線程,進(jìn)程,多核,云)透明,用戶可以在云環(huán)境的終端下,簡單地利用云上的計算資源,

以下(僅)讓我們想象中設(shè)計這樣的編程語言,一些基本概念如下,以下籍 “stage"語言表示,

1.它是一種actor模型,actor可能存在于計算資源的任何一個節(jié)點(diǎn)上(云/進(jìn)程/線程)


host
  1. actor具有層級,actor的工作可能由子actor完成,(但 子actor不一定和父actor在同一計算節(jié)點(diǎn))


    scope.png
  1. actor運(yùn)行時是動態(tài)的, 通過 launch(Actor)創(chuàng)建,actor運(yùn)行時可創(chuàng)建子actor,
launch Actor("manager") {
    on("recruit") {
        launch("worker");
        print("a new worker join");
    }
}
  1. actor有生命周期,父actor銷毀時,子actor也需要銷毀,
{
  // ...
  launch Actor("manager") {
    on("recruit") {
      launch("worker"); // launch 默認(rèn)在當(dāng)前的Actor里launch,也可歸屬于另外的Actor, 這種情況屬于借用,并不管理其生命周期
      print("a new worker join");
    }
  }
}
  1. actor之間通過消息進(jìn)行交互,actor的方法
{
    print(actorOf('b').name()) ;// 這時向可能遠(yuǎn)程的'b'發(fā)送一個請求,send(actorOf('b'), "name", continuation);
} // now manager & workers are disposed!</pre>
  1. actor的方法可能返回,成功或失敗,
try {
  print(actorOf('b').name())
} catch (ex) {
  print('fail to get respond')
}
  1. actor提供了異步方法,取消亦是失敗的一種,
thread1 = async {
    try {
      print(actorOf('b').name())
    } catch(ex) {
      print("must be a cancellation exception")
    }
}
thread1.cancel()

以上的一個“云操作系統(tǒng)”,如何實(shí)現(xiàn)呢,我的想法如下,

任何一段程序有一個所在的環(huán)境,在物理上,它是云上一個主機(jī)上的一個進(jìn)程的一條線程上的一個任務(wù)對象(實(shí)際是一個coroutine,表示為狀態(tài)機(jī)),
它表示為 :<actorID>/<routineID>, 如果actorID不存在于本地,向地址服務(wù)器請求host,

一個異步請求過程如下,假設(shè)當(dāng)前調(diào)用遠(yuǎn)端方法,

actorOf('B').name()

  1. 如果'B‘不在本地,向地址服務(wù)器指請 ’B‘的host,
    構(gòu)造一條請求向host B發(fā)送,:<host B>/<actorID>/request?method=name&sender=<actorID_A>/<rountineID_A>"
  2. host B調(diào)用actor的name方法,生成一個新的routine, 完成后,
    構(gòu)造一條回復(fù)向host A返回:<host A>/<actorID_A>/<routineID_A>/respone?result=...
    當(dāng)然也可返回fail:<host A>/<actorID_A>/<routineID_A>/fail?reason=...

這里的routine由底層的協(xié)程機(jī)制保證,當(dāng)返回時,最終調(diào)用

coroutine.resume_with_result(...) // 或
coroutine.resume_with_fail(...)

Actor編程模型

Actor是一種并發(fā)方式,它把并發(fā)執(zhí)行分解成Actor單元,Actor通過Message進(jìn)行交互,

在我的設(shè)計里,event queue, mailbox, publish/subscribe 都在統(tǒng)一的模型里,

Actor是一種很方便圖形化表示的編程模型

Actor M {
    data {
        ma {
            type = number,
            in,
        }
        mb {
            type = string,
            out,
        }
        mc {
            type = bool,
            out,
        }
        state {
            type = string
        }
    }
 
    // 定義和data基本一致,當(dāng)然,都是類型定義
    event {
        born { type=number,  in } // explict
        quit { in }
        sendNews { out} // 可被觸發(fā)
    }
     
    children {
        worker1 = Actor worker {
            // ...
        }
    }
     
    prefab {
        Actor worker {
            // ...
        }
    }
 
    handle {
        on(evt) {
            case(state) {
                onA,
            }
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容