簡體   English   中英

我將使用Stackless Python做什么?

[英]What would I use Stackless Python for?

有很多與Stackless Python相關的問題。 但沒有人回答我的問題,我想(如果錯了,請糾正我 - 拜托!)。 有一些關於它的嗡嗡聲所以我很想知道。 我會用Stackless做什么用的? 它比CPython好嗎?

是的它有綠色線程(無堆棧),只要沒有操作阻塞(像Ruby的線程?),它可以快速創建許多輕量級線程。 這個有什么用? 它有什么其他功能我想用於CPython?

它允許您使用大量的並發。 沒人理智會創建十萬個系統線程,但你可以使用stackless來做到這一點。

本文測試了這一點,在Python和Google Go(一種新的編程語言)中創建了十萬個tasklet: http//dalkescientific.com/writings/diary/archive/2009/11/15/100000_tasklets.html

令人驚訝的是,即使Google Go被編譯為本機代碼,並且他們吹噓他們的協同例程實現,Python仍然獲勝。

Stackless適用於實現map / reduce算法,根據您的輸入數據,您可以擁有大量的reducer。

Stackless Python的主要好處是支持非常輕量級的協同程序。 CPython本身並不支持協同程序(雖然我希望有人在評論中發布基於生成器的hack)所以當你遇到一個從協同程序中受益的問題時,Stackless是對CPython的明顯改進。

我認為他們擅長的主要領域是當你在程序中運行許多並發任務時。 示例可能是為其AI運行循環腳本的游戲實體,或者是為具有創建速度慢的頁面的許多客戶端提供服務的Web服務器。

然而,對於共享數據,您仍然存在許多典型的並發正確性問題,但確定性任務切換使得編寫安全代碼變得更加容易,因為您確切地知道控制將被轉移到何處,因此知道共享狀態必須的確切點。最新。

Thirler已經提到在Eve Online中使用了stackless。 請記住:

(..)stackless通過允許將任務分成較小的任務Tasklet來進一步加劇這一點,然后可以將它們從主程序中分離出來以便自己執行。 這可以用於即發即棄任務,例如發送電子郵件,調度事件,或用於IO操作,例如發送和接收網絡數據包。 一個tasklet等待來自網絡的數據包,而其他任務繼續運行游戲循環。

它在某些方面類似於線程,但是非搶占式和明確調度,因此同步問題較少。 此外,在tasklet之間切換要比線程切換快得多,並且你可以擁有大量活動的tasklet,而線程的數量受到計算機硬件的嚴格限制。

(從這里得到這個引用)

在2009年的PyCon上,有一個非常有趣的演講 ,描述了在CCP Games中使用Stackless的原因和方式。

此外,還有一個非常好的介紹材料 ,它描述了無堆棧為您的應用程序提供良好解決方案的原因。 (可能有些陳舊,但我認為值得一讀)。

EVEOnline主要在Stackless Python中編程。 他們有幾個關於使用它的開發博客。 它似乎對高性能計算非常有用。

雖然我沒有使用Stackless本身,但我使用Greenlet來實現高度並發的網絡應用程序。 Linden實驗室的一些使用案例包括:高性能智能代理,用於在大量機器上分配命令的快速系統,以及執行大量數據庫寫入和讀取的應用程序(比率約為1) :2,這是非常重寫的,所以它花費大部分時間等待數據庫返回),以及內部Web數據的web-crawler-type-thing。 基本上任何期望必須執行大量網絡I / O的應用程序都將受益於能夠創建bajillion輕量級線程。 10,000個連接的客戶對我來說似乎不是什么大不了的事。

盡管如此,Stackless或Greenlet並不是一個完整的解決方案。 它們是非常低級的,你將不得不做很多的猴子工作來與他們一起構建一個充分利用它們的應用程序。 我知道這是因為我維護了一個庫,它在Greenlet之上提供了一個網絡和調度層,特別是因為使用它編寫應用程序非常容易。 現在有很多這樣的; 我維護了Eventlet,但也有Concurrence,Chiral,還有一些我不知道的東西。

如果您想要編寫的應用程序類似於我所寫的內容,請考慮其中一個庫。 Stackless vs Greenlet的選擇比決定哪個庫最適合您想要做的事情要重要得多。

我認為綠色線程的基本用途是實現一個系統,在該系統中有大量對象執行高延遲操作。 一個具體的例子是與其他機器通信:

def Run():
    # Do stuff
    request_information() # This call might block
    # Proceed doing more stuff

線程允許您自然地編寫上面的代碼,但是如果對象的數量足夠大,則線程無法充分執行。 但是你可以使用綠色線程,即使是非常大的數量。 上面的request_information()可以切換到某個調度程序,其他工作正在等待並稍后返回。 您可以獲得能夠調用“阻塞”函數的所有好處, 就好像它們在不使用線程的情況下立即返回一樣

如果您想以直接的方式編寫代碼,這顯然對任何類型的分布式計算都非常有用。

多個核心緩解等待鎖定也很有趣:

def Run():
    # Do some calculations
    green_lock(the_foo)
    # Do some more calculations

green_lock函數基本上會嘗試獲取鎖,如果由於其他核使用該對象而失敗, green_lock切換到主調度程序。

同樣,綠色線程被用於緩解阻塞,允許代碼自然地編寫並且仍然表現良好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM