摘要:以及和這是操作的。而且要特別注意的含義是把棧頂?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
摘要:特別是最火的協(xié)程框架也無法保存狀態(tài),讓人非常惋惜。但是因為棧的本身無法持久化,所以也就無法持久化。其難度在于,假設(shè)整個要持久化的調(diào)用棧全部都是內(nèi)的,比如純的。采取的是暴力地把整個棧區(qū)域拷貝到上的方式來保存其狀態(tài)。 python主流的協(xié)程實現(xiàn)有五種: cPython的generator cPython的greenlet cPython的fibers stackless python ...
摘要:很長一段時間,我都很天真的認(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...
摘要:協(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ù); 中篇主...
摘要:問題為了防止銷毀時異步任務(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)...
閱讀 3933·2021-09-09 09:33
閱讀 1796·2021-09-06 15:14
閱讀 1936·2019-08-30 15:44
閱讀 3089·2019-08-29 18:36
閱讀 3777·2019-08-29 16:22
閱讀 2104·2019-08-29 16:21
閱讀 2543·2019-08-29 15:42
閱讀 1658·2019-08-29 11:00