Python中类似爱达中心调度的并行处理?

5 投票
2 回答
2007 浏览
提问于 2025-04-17 05:20

有没有办法在Python中使用类似于苹果的Grand Central Dispatch的概念来进行并行处理?从表面上看,Grand Central Dispatch似乎是处理并行处理的一个不错的方法。

如果Python没有一个大致相当的模块,那么Grand Central Dispatch背后的基本概念是什么,可以在Python中有用地实现呢?

我对Grand Central Dispatch了解不多,所以我想问这个问题:我很想知道Grand Central Dispatch是否使用了一些(1)在Python中还没有的范式,或者(2)可以在Python中实现的范式

2 个回答

6

这里主要的问题在于GCD的编译器和操作系统部分。要让GCD正常运行,你需要编译器能够理解“块”(Blocks)。虽然你可以编写一些类似的东西来进行编程,但性能肯定达不到GCD的水平。使用GCD时,你可以创建并排队成千上万的块,但实际上只有2到4个线程在执行这些块。如果你在没有编译器支持的情况下实现块的高级功能,唯一的办法就是用线程来“模拟”块。这样的话,在只有2到4个CPU核心的系统中使用成千上万的线程,会因为上下文切换和内存使用而导致性能混乱。

不仅需要合适的编译器扩展来支持GCD,还需要合适的操作系统扩展来管理GCD队列,块会被排队到这些队列中。操作系统需要以一种方式来控制有多少线程在执行,以及在CPU核心可用时,激活多少线程和何时激活。GCD中,线程和队列是独立的。线程只是从队列中获取块(轻量级的数据结构),可以从任何队列中获取。因此,不管有多少块存在都没关系,因为它们只是存储在主内存中的代码片段和指针。

你根本无法从Python实现这些底层功能。仅仅实现高级的“GCD编程方式”,你写出的程序会非常慢,甚至可能在个人电脑上无法执行。

所以,首先,比如Cython可以支持GCD,同时你想用的操作系统也需要支持。Linux有一个叫libdispatch的实现,适用于Debian。但它只实现了编译器部分,所以程序会启动与系统核心数减去一个的线程数。我觉得这仍然不是一个好选择。应该有人为GCD添加Linux操作系统支持,可能作为一个内核模块。

至于Windows,我就不太清楚了。

所以,第一步自然应该是在Cython中添加并测试对Mac OS的GCD支持。从那里,你可以做一个本地的Python库,内部使用Cython的GCD库,向普通的Python程序员提供块和队列。

另一个选择是CPython项目来支持这个,Python项目将块和队列作为Python的本地特性添加。这将会非常棒XD

1

Python没有一个完全相同的模块,不过twisted使用了很多相似的基本概念,比如异步API和基于回调的方式。Python的多进程模块其实是使用子进程,而不是线程,所以也不能算是完全相同。最好的方法可能是像MacRuby那样,给GCD(Grand Central Dispatch)API创建一些包装,这样就可以使用它们。当然,和Python不同,MacRuby的设计是没有全局解释器锁(GIL)的,这样可以更好地利用多线程。而在Python中,由于不同的解释线程在不同的时间会碰到GIL,这就会影响多线程的效果。除了重新设计语言,恐怕没有其他办法了。

撰写回答