国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【協(xié)程原理】 - Java中的協(xié)程

dongfangyiyu / 2002人閱讀

摘要:很長一段時間,我都很天真的認(rèn)為,特別是以為代表的庫,才是協(xié)程的樂土。里是沒法實現(xiàn)協(xié)程,更別說實現(xiàn)這樣可以的協(xié)程的。咱真的是太井底之蛙了。不完全列表如下還有一個據(jù)作者說是最的這些協(xié)程庫的實現(xiàn)方式都是類似的,都是通過字節(jié)碼生成達到的目的。

很長一段時間,我都很天真的認(rèn)為python,特別是以gevent為代表的庫,才是協(xié)程的樂土。Java里是沒法實現(xiàn)協(xié)程,更別說實現(xiàn)stackless python這樣可以pickle的協(xié)程的。Bong!咱真的是太井底之蛙了。
Java不但可以實現(xiàn)協(xié)程,而且還有很多個實現(xiàn)版本。不完全列表如下:

PicoThreads
http://research.microsoft.com/en-us/um/people/abegel/cs262.pdf

RIFE
http://rifers.org/wiki/display/RIFE/Web%20continuations.html

Javaflow
http://commons.apache.org/sandbox/commons-javaflow/

Matthias Mann"s
http://hg.l33tlabs.org/Continuations/
http://docs.paralleluniverse.co/quasar/
http://indiespot.net/files/projects/continuationslib/

還有一個據(jù)(作者)說是最NB的kilim (https://github.com/kilim/kilim)
這些協(xié)程庫的實現(xiàn)方式都是類似的,都是通過jvm字節(jié)碼生成達到pause/resume的目的。在這篇文章中,RIFE的作者很清楚地講明白了其實現(xiàn)方式:
http://www.artima.com/lejava/articles/continuations.html

  

Geert Bevin: At the byte-code level, when the method pops variables
from the stack, exactly the same operation will be performed on the
parallel stack. We just add a piece of byte code that mimics what goes
on exactly. Then, when a continuation has to be resumed, there"s a bit
of added byte-code that interacts with the state of the stack, and
puts all the variables in the correct location so that they are
present when the executing thread passes that point. At this point,
it"s as if nothing happened—execution resumed as if nothing happened.

  

The second problem is how to arrive at the point to resume a
continuation. You want to skip over code that you don"t want to
execute. That"s easily done in byte code, because you can maintain a
tableswitch in byte code that allows you to jump to a particular
location. You can create a unique label for each continuation point,
jump to that label in the switch table, and then you know exactly what
the stack for that label of variables was. You can restore that stack,
and continue executing from that point on.

kiliam的作者用代碼解釋得更加清楚(http://www.malhar.net/sriram/kilim/thread_of_ones_own.pdf):

// original
void a() throws Pasuable {
    x = ...
    b(); // b is pausable
    print (x);
}

經(jīng)過代碼增強之后是

// transformed code
void a(Fiber f) {
    switch (f.pc) { // prelude
        case 0: goto START;
        case 1: goto CALL_B}
    START:
    x = ...
    CALL_B: // pre_call
    f.down()
    b(f);
    f.up() // post-call
    switch (f.status) {
        case NOT_PAUSING_NO_STATE:
            goto RESUME
        case NOT_PAUSING_HAS_STATE:
            restore state
            goto RESUME
        case PAUSING_NO_STATE :
            capture state, return
        case PAUSING_HAS_STATE:
            return
    }
    RESUME:
    print (x);
}

因為這些框架都是以java對象的方式來存儲call stack state和programe counter的,所以要做到序列化存儲一個執(zhí)行中的狀態(tài)(continuation)一點都不困難。RIFE在其web框架就狠狠地利用了clonable的狀態(tài)來實現(xiàn)復(fù)雜的wizard(回到任意時刻地過去重新執(zhí)行之類的)。
看過了這些實現(xiàn)之后,我不禁覺得持久化一個continuation好像沒啥了不起的,為什么會是stackless python的pypy兩家的獨門絕技呢?基于CPython的兩個協(xié)程實現(xiàn),一個greenlet一個fibers是否可以實現(xiàn)狀態(tài)的持久化?狀態(tài)持久化能不能不用更高效的serializer來實現(xiàn)呢?

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/64140.html

相關(guān)文章

  • 協(xié)程原理】 - 為什么greenlet的狀態(tài)無法被保存

    摘要:特別是最火的協(xié)程框架也無法保存狀態(tài),讓人非常惋惜。但是因為棧的本身無法持久化,所以也就無法持久化。其難度在于,假設(shè)整個要持久化的調(diào)用棧全部都是內(nèi)的,比如純的。采取的是暴力地把整個棧區(qū)域拷貝到上的方式來保存其狀態(tài)。 python主流的協(xié)程實現(xiàn)有五種: cPython的generator cPython的greenlet cPython的fibers stackless python ...

    verano 評論0 收藏0
  • 關(guān)于PHP協(xié)程與阻塞的思考

    摘要:線程擁有自己獨立的棧和共享的堆,共享堆,不共享棧,線程亦由操作系統(tǒng)調(diào)度標(biāo)準(zhǔn)線程是的。以及鳥哥翻譯的這篇詳細(xì)文檔我就以他實現(xiàn)的協(xié)程多任務(wù)調(diào)度為基礎(chǔ)做一下例子說明并說一下關(guān)于我在阻塞方面所做的一些思考。 進程、線程、協(xié)程 關(guān)于進程、線程、協(xié)程,有非常詳細(xì)和豐富的博客或者學(xué)習(xí)資源,我不在此做贅述,我大致在此介紹一下這幾個東西。 進程擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,進程由操作系...

    FullStackDeveloper 評論0 收藏0
  • PHP回顧之協(xié)程

    摘要:本文先回顧生成器,然后過渡到協(xié)程編程。其作用主要體現(xiàn)在三個方面數(shù)據(jù)生成生產(chǎn)者,通過返回數(shù)據(jù)數(shù)據(jù)消費消費者,消費傳來的數(shù)據(jù)實現(xiàn)協(xié)程。解決回調(diào)地獄的方式主要有兩種和協(xié)程。重點應(yīng)當(dāng)關(guān)注控制權(quán)轉(zhuǎn)讓的時機,以及協(xié)程的運作方式。 轉(zhuǎn)載請注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請求 cookie web響應(yīng) sess...

    Java3y 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<