2011-10-31 57 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