Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多线程最佳实践_Python_Multithreading - Fatal编程技术网

Python多线程最佳实践

Python多线程最佳实践,python,multithreading,Python,Multithreading,我最近刚刚读了一篇关于python中GIL(全局解释器锁)的文章。 在Python性能方面,这似乎是一个大问题。所以我在想我自己 归档更高性能的最佳做法是什么。是穿线还是穿线 或者是多重处理?因为我听到每个人都说了不同的话 很高兴有一个明确的答案。或者至少要知道多线程的利弊 反对多重处理 亲切问候, Dirk取决于应用程序和您使用的python实现 在CPython(参考实现)和pypypy中,GIL一次只允许一个线程执行Python字节码。其他线程可能正在执行I/O或运行用C编写的扩展 值得注

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

亲切问候,


Dirk取决于应用程序和您使用的python实现

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

值得注意的是,其他一些实现(如IronPython和JPython)没有GIL

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

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

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

目前,我知道在标准库中,多处理是同时使用所有CPU核心的唯一方法


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

Multiprocessing=forking?这可能是一个很好的答案。这实际上取决于应用程序和数据的类型。我只想补充一下我的个人经历。我主要将Python与
numpy
scipy
库结合使用来进行科学计算。正如我发现的那样,numpy在执行操作时通常会释放GIL。因此,为了满足我的需要,纯Python的
线程库就足够了。GIL不是numpy的问题。无论如何,我需要使用线程来保持GUI(PySide)对事件的响应,因为numpy本身平衡了所有处理器内核上的负载。