【问题标题】:Parallel processing in Python à la Grand Central Dispatch?Python à la Grand Central Dispatch 中的并行处理?
【发布时间】:2011-10-31 15:12:52
【问题描述】:

有没有一种方法可以使用类似于 Apple 的Grand Central Dispatch 的概念在 Python 中进行并行处理?从一开始,Grand Central Dispatch 看起来就是一种处理并行处理的好方法。

如果 Python 没有基本等效的模块,那么 Grand Central Dispatch 背后的哪些基本概念可以在 Python 中有用地实现?

我对 Grand Central Dispatch 了解不多,因此提出了这个问题:我很想知道 Grand Central Dispatch 是否使用 (1) Python 中尚不可用的范例,和/或 (2) 是否可以用 Python 实现

【问题讨论】:

标签: python parallel-processing grand-central-dispatch


【解决方案1】:

这里的主要问题是 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 中为 Mac OS 添加和测试对 CGD 的支持。从那里,您可以创建一个内部使用 de Cython GCD 库的原生 Python 库,为普通的 Python 程序员提供块和队列。

Anoder 选项可以是 CPython 项目来接受这一点,而 Python 项目可以添加块和队列作为 Python 的原生特性。那真是太棒了XD

【讨论】:

    【解决方案2】:

    Python 没有等效的模块,但 twisted 使用许多相同的基本概念(异步 API、基于回调)。 Python 多处理模块实际上使用子进程而不是线程,并且也不是特别等价的。最好的方法可能是类似于 MacRuby 所采用的方法,即为 GCD API 创建包装器并使用它们。当然,与 Python 不同的是,MacRuby 也被设计为没有 GIL(全局解释器锁),这将降低 Python 中多线程的效率,因为各种解释线程在不同时间访问 GIL。恐怕除了重新设计语言之外没什么可做的。

    【讨论】:

    • 感谢您的讨论。通过子流程实现 GCD 的一些核心概念是否有意义?还是已经在 multiprocessingconcurrent.future 模块中完成了?
    • GCD 的核心概念之一是它是轻量级的,并且您的块/回调在相同的地址空间中运行,所以不,我认为这样做没有意义。我认为 API 包装器仍然是最有意义的。
    • 谢谢。您是否暗示在 Grand Central Dispatch(源、组等)中没有 Python 以某种形式或其他形式(例如在其 multiprocessingconcurrent.futures 模块中)所没有的概念?
    • 我并不是说 GCD 和不断扩展的 Python 世界之间有 no 的概念,我确信有,但 GCD 也带来了一定的其处理并发的方法的设计一致性,我认为“混合和匹配”不会提供您想要的结果,特别是如果您希望所有各种子系统能够很好地(线程安全地)相互配合。
    猜你喜欢
    • 2018-05-14
    • 2012-05-09
    • 1970-01-01
    • 2012-11-27
    • 2011-07-28
    • 2023-03-25
    • 2011-06-04
    • 1970-01-01
    相关资源
    最近更新 更多