2013-07-28 133 views
0

我真的很佩服無堆棧的Python的功能,我一直在四處尋找一種方式,同時還使用標準的Python 3解釋效仿它的語法。 An article by Alex J. Champandard in a gamedev blog使它看起來好像greenlet庫可以提供這種功能。我稍微修改了代碼,但最好的臨時任務蕾包裝我能想出是一類抱着一個變量裏面greenlet,因爲這樣的:實現無堆棧的Python

class tasklet(): 
     def __init__(self,function=None,*variables): 
       global _scheduled 
       self.greenlet = greenlet.greenlet(function,None) 
       self.functioncall = function # Redundant backup 
       self.variables = variables 
       _scheduled.append(self) 
       self.blocked = False 

該函數然後通過傳遞變量到模擬Stackless的調度當調用它的switch()方法時。

到目前爲止,這似乎工作,但我希望能夠調用的任務蕾原Stackless的語法,如tasklet(function)(*args),相對於的tasklet(function,*args)當前語法。我不確定在文檔中查找該如何完成此操作的位置。這甚至是可能的,還是Stackless對解釋器的改變的一部分?

+1

已經有基於greenlet的Stackless API的實現。我沒有提供鏈接,因爲我沒有聲望,當我嘗試和分享研究時,發現拒絕帖子的錯誤。這對我來說只是谷歌而言浪費了很多時間。 – user2063430

回答

0

根據this article from 2010-01-08(與固定鏈路):

Stackless Python是Python語言(和 其CPython的參考實現)的擴展版本。新功能包括 輕量級協程(稱爲小程序),使用消息傳遞(稱爲通道)的 通信原語,協同調度,手動和/或自動 ,不使用C協議棧Python函數調用,以及 協程序列化處理)。 無堆棧的Python不能被實現爲一個Python擴展模塊 - CPython的編譯器和解釋器的核心必須進行修補。

greenlet是CPython提供協同程序和 低級(顯式)調度的擴展模塊。 greenlet優於Stackless Python的最大優勢在於greenlet可以作爲Python擴展模塊實現 ,因此必須重新編譯整個Python解釋器以便使用greenlet。 greenlet的缺點包括速度(根據工作流程不同,Stackless Python可以更快10%,35%或900%);如果 協同程序互相引用,則可能的內存泄漏;和所提供的功能 爲低電平(即,僅手動協程調度,傳遞提供無 消息)。

我最近開發的Python模塊greenstackless提供了大部分使用greenlet的(高級別)Stackless Python API,所以它 消除了greenlet的低級別的缺點。見 source codesome tests(在棘手的角落情況下,後者)。 請注意,儘管greenstackless已經優化了一下,但它可能比無堆棧Python慢​​ ,並且它也不能修復內存中的 泄漏。因此,在生產 環境中不推薦使用綠色堆疊;但是如果替換Python解釋器不是 可行的話,它可以用作臨時插入替換 的Stackless Python。

模仿無堆棧使用greenlet其他一些軟件:

Concurrence:不支持stackless.main,tasklet.next, tasklet.prev,tasklet.insert,tasklet.remove, stackless.schedule_remove,沒有按不正確發送異常。 (由於這些特徵 缺失,其不通過上面的單元測試。)

PyPy:不支持stackless.main,tasklet.next,tasklet.prev, 沒有通過上面的單元測試。