最早的計算機(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)程/線程)

-
actor具有層級,actor的工作可能由子actor完成,(但 子actor不一定和父actor在同一計算節(jié)點(diǎn))
scope.png
- 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");
}
}
- actor有生命周期,父actor銷毀時,子actor也需要銷毀,
{
// ...
launch Actor("manager") {
on("recruit") {
launch("worker"); // launch 默認(rèn)在當(dāng)前的Actor里launch,也可歸屬于另外的Actor, 這種情況屬于借用,并不管理其生命周期
print("a new worker join");
}
}
}
- actor之間通過消息進(jìn)行交互,actor的方法
{
print(actorOf('b').name()) ;// 這時向可能遠(yuǎn)程的'b'發(fā)送一個請求,send(actorOf('b'), "name", continuation);
} // now manager & workers are disposed!</pre>
- actor的方法可能返回,成功或失敗,
try {
print(actorOf('b').name())
} catch (ex) {
print('fail to get respond')
}
- 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()
- 如果'B‘不在本地,向地址服務(wù)器指請 ’B‘的host,
構(gòu)造一條請求向host B發(fā)送,:<host B>/<actorID>/request?method=name&sender=<actorID_A>/<rountineID_A>" - 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,
}
}
}
}
