成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

dongfangyiyu / 2009人閱讀

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

很長一段時(shí)間,我都很天真的認(rèn)為python,特別是以gevent為代表的庫,才是協(xié)程的樂土。Java里是沒法實(shí)現(xiàn)協(xié)程,更別說實(shí)現(xiàn)stackless python這樣可以pickle的協(xié)程的。Bong!咱真的是太井底之蛙了。
Java不但可以實(shí)現(xiàn)協(xié)程,而且還有很多個(gè)實(shí)現(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/

還有一個(gè)據(jù)(作者)說是最NB的kilim (https://github.com/kilim/kilim)
這些協(xié)程庫的實(shí)現(xiàn)方式都是類似的,都是通過jvm字節(jié)碼生成達(dá)到pause/resume的目的。在這篇文章中,RIFE的作者很清楚地講明白了其實(shí)現(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)過代碼增強(qiá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);
}

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64140.html

相關(guān)文章

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

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

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

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

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

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

    Java3y 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<