Python多线程最佳实践

时间:2014-04-20 18:07:25

标签: python multithreading

我刚刚在python中阅读了一篇关于GIL(全局解释器锁)的文章。 在Python性能方面,这似乎是一个大问题。所以我在想自己 存档更多性能的最佳做法是什么?它是线程还是 要么多处理?因为我听到每个人都说不同的东西,它会是 很高兴得到一个明确的答案。或者至少知道多线程的优缺点 反对多处理。

亲切的问候,

德克

1 个答案:

答案 0 :(得分:5)

这取决于应用程序,以及您正在使用的python实现。

在CPython(参考实现)和pypy中,GIL一次只允许一个线程执行Python字节码。其他线程可能正在进行I / O或运行用C编写的扩展。

值得注意的是,像IronPython和JPython这样的其他一些实现都没有GIL。

线程的一个特征是所有线程共享相同的解释器和所有活动对象。因此,线程几乎无需额外的努力就可以共享全局数但是,您需要使用锁定来序列化对数据的访问!想象一下,如果两个线程试图修改相同的列表会发生什么。

多处理实际上在不同的进程中运行。回避GIL,但是如果需要在进程之间共享大量数据,那么数据必须通过IPC进行pickle并传输到另一个进程,在那里必须再次进行unickickled。多处理模块可以为您处理混乱的细节,但它仍然增加了开销。

因此,如果您的程序想要并行运行Python代码但不需要在实例之间共享大量数据(例如,只需要处理的文件的文件名),那么多处理是一个不错的选择。 p>

目前,多处理是我在标准库中了解的唯一方法,可以同时使用CPU的所有内核。

另一方面,如果您的任务需要共享大量数据,并且大部分处理是在扩展中完成的,或者是I / O,则线程将是一个不错的选择。