2011-10-31 56 views
3

有沒有一種使用類似於Apple的Grand Central Dispatch的概念在Python中進行並行處理的方法? Grand Central Dispatch從一開始就看起來就像處理並行處理的一種很好的方式。Python中的並行處理大中央調度?

如果Python沒有大部分等效的模塊,那麼Grand Central Dispatch背後的基本概念可以在Python中實現嗎?我很想知道Grand Central Dispatch是否使用(1)在Python中尚不可用的範例,和/或(2)可能是在Python中實現。

+2

請參閱'multiprocessing' http://docs.python.org/library/multiprocessing.html –

+0

@AustinMarshall:你是否暗示''多處理'本質上包含了Grand Central Dispatch的所有核心概念? – EOL

回答

1

Python沒有等效模塊,儘管扭曲使用了許多相同的基本概念(異步API,基於回調)。 Python多處理模塊實際上使用子進程而不是線程,並且不是特別等同。最好的方法可能與MacRuby採用的方法類似,該方法是爲GCD API創建包裝並使用它們。與Python不同的是,MacRuby也被設計爲不具有GIL(全局解釋器鎖),這會降低Python中多線程的效率,因爲各種解釋線程在不同時間碰到GIL。恐怕除了重新設計語言之外,還有很多事情要做。

+0

謝謝你的討論。通過子流程實施GCD的一些核心概念是否有意義?還是已經在'multiprocessing'或'concurrent.future'模塊中完成了? – EOL

+1

GCD的核心概念之一是它重量輕,並且您的塊/回調運行在相同的地址空間,所以不,我認爲這樣做沒有意義。我認爲API包裝仍然是最有意義的。 – jkh

+1

謝謝。您是否暗示沒有來自Grand Central Dispatch(Sources,Groups,...)的Python沒有以某種形式或其他形式存在的概念(例如在其「多處理」和「concurrent.futures」模塊中)? – EOL

3

這裏的主要問題是GCD的編譯器和操作系統部分。爲了讓GCD運行,您需要編譯器來理解Blocks。你可以在編程時創建類似的工作,但它不會有相同的性能。使用GCD,您可以創建並排列數千個塊,並且仍然只有2或4個線程執行此塊。如果在編譯器接受它們的情況下實現塊的高級功能,我所看到的唯一方法是使用線程來「模擬」塊。然後,由於上下文切換和內存使用,在具有2至4個CPU內核的系統中使用數千個線程將會是一個令人驚歎的性能混亂。

不僅需要適當的編譯器擴展來支持GCD,還需要適當的操作系統擴展來管理排入隊列的GCD隊列。對於使用GCD的程序,您需要操作系統以控制執行多少個線程的方式運行,以及在CPU內核可用時要激活多少線程。使用GCD,線程和隊列是獨立的。線程只是從隊列(輕量級數據結構)中獲取塊,但是從任何這些線程中獲取。因此,有多少塊並不重要,因爲它們只是代碼塊和存儲在主存儲器中某處的指針。

你根本無法實現python的所有這些低級功能。只有實施高水平的「GCD編程方式」,您纔會製作速度慢的程序,或者甚至不可能在個人計算機上執行。因此,首先,例如Cython應該支持GCD,以及您想要使用的操作系統。 Linux有一個名爲libdispatch的實現,可用於Devian。但是它只實現了編譯器部分,所以程序啓動的線程數與系統內核的線數相差很多。所以我認爲這還不是一個好的選擇。有人應該爲GCD添加Linux操作系統支持,可能作爲內核模塊。

沒有關於windows的說法。我真的不知道。

因此,第一個自然的步驟,應該是添加和測試在Cython for Mac OS中對CGD的支持。從那裏,你可以做一個內部使用de Cython GCD庫的本地Python庫,爲普通的python程序員提供塊和隊列。

Anoder選項可以是CPython項目來支持這一點,Python項目可以將塊和隊列添加爲python的本地特性。這將是驚人的XD