Python多线程最佳实践
我最近读了一篇关于Python中GIL(全局解释器锁)的文章。这个问题似乎在Python性能方面是个大问题。所以我在想,怎样才能提高性能呢?是用线程还是用多进程呢?因为我听到大家的说法都不一样,能有一个明确的答案就好了。或者至少知道多线程和多进程各自的优缺点。
祝好,
Dirk
1 个回答
7
这要看你的应用程序和你使用的Python版本。
在CPython(官方版本)和pypy中,GIL(全局解释器锁)只允许一个线程同时执行Python字节码。其他线程可能在进行输入输出操作,或者在运行用C语言写的扩展。
值得注意的是,一些其他的实现,比如IronPython和JPython,是没有GIL的。
线程的一个特点是,所有线程共享同一个解释器和所有活跃的对象。所以线程几乎不需要额外的努力就可以共享全局数据。不过,你需要使用锁来控制对数据的访问!想象一下,如果两个线程同时试图修改同一个列表,会发生什么。
多进程实际上是在不同的进程中运行。这绕过了GIL,但如果需要在进程之间共享大量数据,这些数据必须被序列化(也就是“打包”),然后通过进程间通信(IPC)传输到另一个进程,在那里又要被反序列化(“解包”)。多进程模块可以帮你处理这些麻烦的细节,但仍然会增加一些开销。
所以,如果你的程序想要并行运行Python代码,但不需要在实例之间共享大量数据(比如只需要处理文件名),那么多进程是个不错的选择。
目前,在标准库中,多进程是我知道的唯一可以同时使用你CPU所有核心的方法。
另一方面,如果你的任务需要共享大量数据,并且大部分处理是在扩展中完成或者是输入输出操作,那么使用线程会是一个好选择。