<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    ??? Actor、CoroutineContinuation這三個概念由于并發的受關注而被經常提到,這里主要想談下這三者的區別和聯系,以便更好的區分問題領域和討論。首先,Actor和Coroutine在我看來是兩種并發模型,僅針對于并發這個領域,而Continuation則是程序設計領域的一個概念,相比于Actor和Coroutine是一個更基礎的概念。

    ??? 那么,什么是Continuation?這個要從表達式的求值說起。一個表達式的求值可以分為兩個階段:“What to evaluate?”和“What to do with the value”,“What to do with the value”就是計算的Continuation。以下面這段代碼為例:
    if?x<3?then
    ???
    return?x+1
    else
    ???
    return?x
    end

    ??? 考察其中的表達式x<3,這個表達式就是“what to evaluate?”,代表你將計算的東西,然后根據x<3的結果決定是執行x+1還是直接返回x,這個根據x<3的值來決定下一步的過程就是這個表達式的Continuation,也就是"what to do with the value"。怎么得到某個表達式的Continuation呢?在支持Continuation的語言里提供了call-with-current-continuation的函數,通常簡稱為call/cc,使用這個函數你就可以在任何代碼中得到Continuation。進一步,continuation有什么作用呢?它可以做的事情不少,如nonlocal exits、回溯、多任務的實現等等。例如在scheme中沒有break語句,就可以用call/cc實現一些此類高級的控制結構:

    (call/cc?(lambda?(break)
    ????????(
    for-each?(lambda?(x)?(if?(<?x?0)?(break?x)))
    ????????????????
    '(99?88?-77?66?55))
    ????????#t))


    ??? 上面這段代碼查找列表(99 88 -77 66 55)中的負數,當查找到的時候馬上從迭代中退出并返回該值,其中的break就是一個continuation。剛才還提到continuation可以實現回溯,那么就可以實現一個窮舉的機器出來用來搜索解空間,也就是類似Prolog中的回溯機制,在SICP這本書里就介紹了如何用call/cc實現一個簡單的邏輯語言系統。更著名的就是神奇的amb操作符,有興趣可以看看這里
    ????
    ???? 接下來我們來看看如何continuation實現多任務,在Continuation的維基百科里給了一段代碼來展示如何用scheme來實現coroutine,我稍微修改了下并添加了注釋:
    ;;continuation棧,保存了等待執行的continuation
    (define?call/cc?call-with-current-continuation)
    (define?*queue*?'())

    (define?(empty-queue?)
    ????????(null??*queue*))

    (define?(enqueue?x)
    ????????(set!?*queue*?(append?*queue*?(list?x))))

    (define?(dequeue)
    ????????(let?((x?(car?*queue*)))
    ??????????????(set!?*queue*?(cdr?*queue*))
    ?????????x))
    ;;啟動協程
    (define?(resume?proc)
    ???????(call/cc
    ?????????(lambda?(k)
    ???????????;;保存當前continuation,執行proc
    ???????????(enqueue?k)
    ???????????(proc))))
    ;;讓出執行權
    (define?(yield)
    ?????(call/cc
    ??????(lambda?(k)
    ?????????;;保存當前continuation,彈出上一次執行的cont并執行
    ????????(enqueue?k)
    ????????((dequeue)))))
    ;;停止當前協程或者當沒有一個協程時停止整個程序,最簡單的調度程序
    (define?(thread-exit)
    ?????(if?(empty-queue?)
    ?????????(exit)
    ?????????((dequeue))))
    (注:scheme以分號開頭作為注釋)

    ???? 這其實就是一個coroutine的簡單實現,context的保存、任務的調度、resume/yield原語……樣樣俱全。使用起來類似這樣,下面這段程序輪流打印字符串:
    (define?(display-str?str)
    ????????(lambda()
    ?????????(let?loop()
    ??????????????(display?str)
    ??????????????(newline)
    ??????????????(yield)
    ??????????????(loop))))

    ;;;創建兩個協程并啟動調度器
    (resume?(display-str?"This?is?AAA"))
    (resume?(display-str?"Hello?from?BBB"))
    (thread-exit)

    ???? 任務非常簡單,打印下傳入的字符串并換行,然后讓出執行權給另一個任務執行,因此輸出:
    This?is?AAA
    Hello?from?BBB
    This?is?AAA
    Hello?from?BBB
    This?is?AAA
    Hello?from?BBB
    This?is?AAA
    Hello?from?BBB
    ……

    ??? 談了這么多continuation的應用,事實上我想說明的是continuation可以用來實現協程,Ruby 1.9中call/cc和Fiber的實現(在cont.c)大體是一樣的同樣說明了這一點。

    ???? 接下來我們討論下Actor和Coroutine的關系,上面提到Actor是一種并發模型,我更愿意稱之為一種編程風格,Actor跟message passing、Duck Typing是一脈相承的。Actor風格是可以這么描述:將物理世界抽象成一個一個的Actor,Actor之間通過發送消息相互通信,Actor不關心消息是否能被接收或者能否投遞到,它只是簡單地投遞消息給其他actor,然后等待應答。Actor相比于Coroutine是一種更高層次的抽象,它提供的receive和pattern match的原語更接近于現實世界,而使用coroutine編程你還需要手工介入任務調度,這在Actor中是由一個調度器負責的。

    ??? 同樣,Actor可以用coroutine實現,例如Ruby有個revactor項目,就是利用1.9引入的Fiber實現actor風格的編程,它的實現非常簡單,有興趣地可以看看,其實跟continuation實現coroutine類似。但是Actor并不是一定要用coroutine才能實現,Actor是一種編程風格,你在Java、C#、C++中同樣可以模擬這樣的方式去做并發編程,.net社區的老趙實現過一個簡單的ActorScala的Actor實現是基于外部庫,利用scala強大的元編程能力使得庫的使用像內置于語言。

    ??? 總結下我想表達的:Continuation是程序設計領域的基礎概念,它可以用于實現coroutine式的多任務,Actor是一種比之coroutine更為抽象的編程風格,Actor可以基于Coroutine實現但并非必須,Actor和Coroutine都是現在比較受關注的并發模型。



    主站蜘蛛池模板: 91免费播放人人爽人人快乐| 免费A级毛片av无码| 精品久久免费视频| 在线综合亚洲欧洲综合网站| 丁香花免费高清视频完整版| 亚洲一级高清在线中文字幕| 一二三四免费观看在线电影| 亚洲免费在线视频观看| 99re热免费精品视频观看 | 久久精品国产亚洲AV蜜臀色欲 | 一级日本高清视频免费观看| 亚洲一区二区三区免费| 亚洲精品偷拍视频免费观看| 亚洲人成网7777777国产| 久久精品视频免费播放| 亚洲婷婷天堂在线综合| 欧洲黑大粗无码免费| 精品国产日韩亚洲一区在线| 亚洲午夜成人精品电影在线观看| 亚洲日韩在线观看免费视频| 久久噜噜噜久久亚洲va久| 国产成人精品免费视频大全麻豆 | 精品四虎免费观看国产高清午夜 | 亚洲午夜福利精品久久| 国产成人精品无码免费看| 亚洲欧洲久久精品| 国产青草视频免费观看97| xxxxx做受大片视频免费| 亚洲永久中文字幕在线| 免费看大美女大黄大色| 久久久久女教师免费一区| 亚洲午夜电影一区二区三区| 亚洲?V乱码久久精品蜜桃| 久久伊人免费视频| 欧美色欧美亚洲另类二区| 亚洲av网址在线观看| 四虎影院免费在线播放| 免费无码又爽又刺激高潮软件| 亚洲一级毛片免费在线观看| 亚洲精品色婷婷在线影院| 亚洲一级免费毛片|