Sve*_*ach 16
线程和多处理之间的许多差异并不是特定于Python的,并且某些差异特定于某个Python实现.
对于CPython,我会multiprocessing在以下情况中使用该模块:
出于性能原因,我需要同时使用多个内核.全局解释器锁(GIL)将阻止使用线程时的任何加速.(有时候你可以在这种情况下逃脱线程,例如当主要工作在C代码中完成,ctypes或者在使用Cython时,或者明确地释放适当的GIL.当然后者需要额外注意.)注意这个案件实际上相当罕见.大多数应用程序不受处理器时间的限制,如果确实如此,通常不使用Python.
我想稍后将我的应用程序转换为真正的分布式应用程序.对于多处理应用程序来说,这样做要容易得多.
要执行的任务之间需要很少的共享状态.
在几乎所有其他情况下,我会使用线程.(这包括使GUI应用程序响应.)
为了清晰代码,最重要的事情之一就是学会了解并喜欢Queue对象,以便在线程(或进程之间)进行通信,如果使用多处理 ...多处理有自己的Queue对象.队列使事情变得更容易,我认为启用更清晰的代码.
我找了一些不错的Queue示例,这个例子有一些很好的例子,说明如何使用它们以及它们的用处(使用完全相同的逻辑申请多处理队列):http: //effbot.org/librarybook/ queue.htm
为了提高效率,细节和结果可能不会对大多数人产生明显影响,但对于python <= 3.1,CPython的实现在您可能想要了解的多核机器上有一些有趣(并且可能是残酷的)效率问题.这些问题涉及GIL.David Beazley不久前做了一段视频演示,绝对值得一看.这里有更多信息,包括后续讨论python 3.2中这方面的重大改进.
基本上,我对GIL相关多核问题的简要总结是,如果你希望通过使用多个线程从CPython <= 2.7中获得完整的多处理器使用,那么如果性能不是很好,或者甚至更糟,不要感到惊讶比单核心.但是如果你的线程正在进行一堆i/o(文件读/写,数据库访问,套接字读/写等),你可能甚至都没有注意到这个问题.
多处理模块完全通过为每个处理器创建python解释器(和GIL)来避免这种潜在的GIL问题.