有没有办法在Python中使用类似于Apple Grand Central Dispatch的概念进行并行处理? Grand Central Dispatch从一开始就看起来像处理并行处理的好方法。
如果Python没有一个大致相同的模块,那么Grand Central Dispatch背后的基本概念有哪些可以在Python中实现?
我不太了解Grand Central Dispatch,因此这个问题:我很想知道 Grand Central Dispatch是否使用了(1)在Python中尚未提供的范例,和/或(2)可以用Python实现。
答案 0 :(得分:4)
这里的主要问题是GCD的编译器和OS部分。为了让GCD运行,您需要编译器来理解块。你可以在编程时创建类似的东西,但它根本不会有相同的性能。使用GCD,您可以创建和排队数千个块,但仍然只有2或4个线程执行此块。如果你在没有编译器接受它的情况下实现Blocks的高级功能,我看到的唯一方法是使用线程来“模拟”块。然后,在具有2到4个CPU内核的系统中使用数千个线程,由于上下文切换和内存使用,这将是一个惊人的性能混乱。
您不仅需要适当的编译器扩展来支持GCD,而且还需要适当的OS扩展来管理Block入队的GCD队列。对于使用GCD的程序,您需要操作系统以一种控制执行线程数的方式运行,以及在CPU核心可用时激活的时间和数量。使用GCD,线程和队列是独立的。线程只是从队列(轻量数据结构)中获取块,但是从任何队列中获取块。所以有多少块并不重要,因为它们只是存储在主存储器中的代码和指针。
你根本无法从python实现所有这些低级功能。只有实现高级“GCD编程方式”,你才会制作慢速程序,甚至不可能在个人计算机上执行。
首先,例如Cython可以支持GCD,以及您想要使用的操作系统。 Linux有一个名为libdispatch的实现,可用于Devian。但它只实现了编译器部分,因此程序启动的线程数与系统内核数减去一个。所以我认为它仍然不是一个好选择。有人应该为GCD添加Linux OS支持,可能作为内核模块。
没有什么可说的Windows。我真的不知道。
因此,第一个自然步骤应该是在Mac OS中添加和测试Cython中对CGD的支持。从那里,你可以做一个内部使用de Cython GCD库的本机Python库,为普通的python程序员提供块和队列。
Anoder选项可以是CPython项目,以及Python项目添加块和队列作为python的本机功能。这将是惊人的XD
答案 1 :(得分:1)
Python没有等效的模块,虽然twisted使用了许多相同的基本概念(async API,基于回调)。 Python多处理模块实际上使用子进程而不是线程,并且也不是特别等效。最好的方法可能类似于MacRuby采用的方法,即为GCD API创建包装并使用它们。当然,与Python不同,MacRuby也被设计为不具有GIL(全局解释器锁),这将降低Python中多线程的有效性,因为各种解释线程在不同时间点击GIL。除了重新设计语言之外没什么可做的,我很害怕。