摘要:很長一段時間,我都很天真的認(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
摘要:特別是最火的協(xié)程框架也無法保存狀態(tài),讓人非常惋惜。但是因為棧的本身無法持久化,所以也就無法持久化。其難度在于,假設(shè)整個要持久化的調(diào)用棧全部都是內(nèi)的,比如純的。采取的是暴力地把整個棧區(qū)域拷貝到上的方式來保存其狀態(tài)。 python主流的協(xié)程實現(xiàn)有五種: cPython的generator cPython的greenlet cPython的fibers stackless python ...
摘要:線程擁有自己獨立的棧和共享的堆,共享堆,不共享棧,線程亦由操作系統(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í)資源,我不在此做贅述,我大致在此介紹一下這幾個東西。 進程擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,進程由操作系...
摘要:本文先回顧生成器,然后過渡到協(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...
閱讀 3685·2021-11-25 09:43
閱讀 2645·2021-11-25 09:43
閱讀 3844·2021-11-24 09:38
閱讀 697·2021-11-18 10:02
閱讀 2237·2021-09-22 15:53
閱讀 2998·2019-08-30 15:44
閱讀 2774·2019-08-30 14:01
閱讀 2754·2019-08-29 15:15