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

資訊專欄INFORMATION COLUMN

【協(xié)程原理】 - cPython的VM真{{BANNED}}

Taonce / 824人閱讀

摘要:以及和這是操作的。而且要特別注意的含義是把棧頂?shù)闹禈?biāo)識為,使得可以使用,所以還不是簡單地把恢復(fù)就可以了這篇博客把的內(nèi)部狀態(tài)講得非常清楚以上可以解釋為什么沒有人在里搞字節(jié)碼的了,因為這個太{{BANNED}}。

kilim在JVM上實現(xiàn)了協(xié)程,其實現(xiàn)看起來挺容易的:http://www.malhar.net/sriram/kilim/thread_of_ones_own.pdf
在cPython上是否能夠復(fù)制其技法呢?粗看上去,是很容易的,甚至比JVM更好實現(xiàn):

利用sys._getframe(0)可以獲得call stack上的任意frame

frame的f_locals可以獲得這個frame的所有局部變量的值(https://docs.python.org/3/library/inspect.html)

雖然python不支持goto或者longjmp,然后cPython的bytecode是支持JUMP_ABSOLUTE的(https://docs.python.org/3/library/dis.html)

一個更加牛B的事情是,有人已經(jīng)用@goto裝飾器的方式在Python上實現(xiàn)了GOTO了
這個是Python 2版本的:http://code.activestate.com/recipes/576944-the-goto-decorator/
這個是Python 3版本的:https://github.com/cdjc/goto

這兩個實現(xiàn)很好的展示了如何在Python中做類似JVM上ASM庫做的事情,字節(jié)碼增強(qiáng)。

===============
但是,cPython的VM對于frame狀態(tài)的建模使得在cPython上實現(xiàn)kilim,比JVM要難得多。在cPython某個指令執(zhí)行的那一刻,有五個部分的狀態(tài)

builtins

globals

locals

value_stack

block_stack

前三個都是python里做動態(tài)執(zhí)行的??停瑳]啥困難的。而且frame通過inpsect可以很輕易的獲得locals的值。而后兩者是非常困難的,我們可以來看一段我隨便寫的代碼

for i in range(1):
    print(i)

生成的bytecode是

      0 SETUP_LOOP         30 (to 33) 
      3 LOAD_GLOBAL         0 (0) 
      6 LOAD_CONST          1 (1) 
      9 CALL_FUNCTION       1 (1 positional, 0 keyword pair) 
     12 GET_ITER        
>>   13 FOR_ITER           16 (to 32) 
     16 STORE_FAST          0 (0) 
     19 LOAD_GLOBAL         1 (1) 
     22 LOAD_FAST           0 (0) 
     25 CALL_FUNCTION       1 (1 positional, 0 keyword pair) 
     28 POP_TOP         
     29 JUMP_ABSOLUTE      13 
>>   32 POP_BLOCK       
>>   33 LOAD_CONST          0 (0) 
     36 RETURN_VALUE 

我們可以看到一個簡單的循環(huán),產(chǎn)生了一對SETUP_LOOP和POP_BLOCK,這個是操作block_stack的。以及GET_ITER和FOR_ITER這是操作value_stack的。如果我們想要直接跳入到print(i)這一行,那么就要恢復(fù)當(dāng)時的block_stack,以及當(dāng)時的value_stack。而且要特別注意GET_ITER的含義是把棧頂?shù)闹禈?biāo)識為ITER,使得FOR_ITER可以使用,所以還不是簡單地把value_stack恢復(fù)就可以了

GET_ITER
Implements TOS = iter(TOS).

這篇博客把python的frame內(nèi)部狀態(tài)講得非常清楚:http://tech.blog.aknin.name/tag/block-stack/
以上可以解釋為什么沒有人在python里搞字節(jié)碼的trick了,因為這個VM太{{BANNED}}。

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/37398.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
  • 協(xié)程原理】 - Java中協(xié)程

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

    dongfangyiyu 評論0 收藏0
  • Swoole協(xié)程之旅-前篇

    摘要:協(xié)程完全有用戶態(tài)程序控制,所以也被成為用戶態(tài)的線程。目前支持協(xié)程的語言有很多,例如等。協(xié)程之旅前篇結(jié)束,下一篇文章我們將深入分析原生協(xié)程部分的實現(xiàn)。 寫在最前 ??Swoole協(xié)程經(jīng)歷了幾個里程碑,我們需要在前進(jìn)的道路上不斷總結(jié)與回顧自己的發(fā)展歷程,正所謂溫故而知新,本系列文章將分為協(xié)程之旅前、中、后三篇。 前篇主要介紹協(xié)程的概念和Swoole幾個版本協(xié)程實現(xiàn)的主要方案技術(shù); 中篇主...

    terasum 評論0 收藏0
  • 史上最優(yōu)雅VM層取消Coroutine方式

    摘要:問題為了防止銷毀時異步任務(wù)仍然在進(jìn)行所導(dǎo)致的內(nèi)存泄露,我們都會在方法中去取消異步任務(wù)??偨Y(jié)層可以天然自動監(jiān)視銷毀,我一直在找尋如何優(yōu)雅的自動取消異步任務(wù),在目前來看是最佳的方案。協(xié)程絕對是最先進(jìn)的,效率最高,最優(yōu)雅的技術(shù)棧組合。前提 在Android MVVM模式,我使用了Jetpack包中的ViewModel來實現(xiàn)業(yè)務(wù)層,當(dāng)然你也可以使用DataBinding,關(guān)于Android業(yè)務(wù)層架構(gòu)...

    cuieney 評論0 收藏0

發(fā)表評論

0條評論

Taonce

|高級講師

TA的文章

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