Python多线程最佳实践

Dir*_*irk 2 python multithreading

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

亲切的问候,

短剑

Rol*_*ith 5

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

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

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

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

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

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

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

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