gpt4 book ai didi

python - Python 支持多线程吗?它可以加快执行时间吗?

转载 作者:太空宇宙 更新时间:2023-11-04 03:49:04 33 4
gpt4 key购买 nike

我对多线程在 Python 中是否有效有点困惑。

我知道有很多关于此的问题,并且我已经阅读了其中的很多问题,但我仍然感到困惑。根据我自己的经验,并且看到其他人在 StackOverflow 上发布了自己的答案和示例,我知道多线程在 Python 中确实是可能的。那么为什么大家一直说Python被GIL锁住了,一次只能运行一个线程呢?显然它确实有效。还是有什么我在这里没有理解的区别?

许多发帖者/受访者还不断提到线程是有限的,因为它不使用多核。但我想说它们仍然有用,因为它们同时工作,因此可以更快地完成组合工作负载。我的意思是,否则为什么会有 Python 线程模块呢?

更新:

感谢迄今为止的所有回答。我的理解是,多线程只会并行运行某些 IO 任务,但对于 CPU 密集型多核任务一次只能运行一个。

我不完全确定这在实际中对我意味着什么,所以我只举一个我想要多线程的任务类型的例子。例如,假设我想循环遍历一个很长的字符串列表,并且我想对每个列表项执行一些基本的字符串操作。如果我拆分列表,发送每个子列表以供新线程中的循环/字符串代码处理,并将结果发送回队列中,这些工作负载是否会大致同时运行?最重要的是,理论上这会加快运行脚本所需的时间吗?

另一个例子可能是,如果我可以在四个不同的线程中使用 PIL 渲染并保存四张不同的图片,这比逐个处理图片更快吗?我想我真正想知道的是这个速度组件,而不是正确的术语是什么。

我也了解多处理模块,但我现在的主要兴趣是中小型任务负载(10-30 秒),因此我认为多线程会更合适,因为子进程启动速度可能很慢。

最佳答案

GIL 不会阻止线程。 GIL 所做的只是确保一次只有一个线程正在执行 Python 代码;控制仍然在线程之间切换。

GIL 所防止的是使用多个 CPU 核心或单独的 CPU 并行运行线程。

这仅适用于 Python 代码。 C 扩展可以并且确实释放了 GIL,以允许 C 代码的多个线程和一个 Python 线程跨多个内核运行。这扩展到由内核控制的 I/O,例如用于套接字读取和写入的 select() 调用,使 Python 在多线程多核设置中相当有效地处理网络事件。

许多服务器部署所做的就是运行多个 Python 进程,让操作系统处理进程之间的调度,以最大限度地利用 CPU 核心。您还可以使用multiprocessing library如果适合您的用例,则可以处理来自一个代码库和父进程的跨多个进程的并行处理。

请注意,GIL 仅适用于 CPython 实现; Jython 和 IronPython 使用不同的线程实现(分别是 native Java VM 和 .NET 公共(public)运行时线程)。

直接解决您的更新问题:任何尝试使用纯 Python 代码从并行执行中获得速度提升的任务都不会看到加速,因为线程 Python 代码被锁定到一次执行一个线程。但是,如果混合使用 C 扩展和 I/O(例如 PIL 或 numpy 操作),则任何 C 代码都可以与一个事件 Python 线程并行运行。

Python 线程非常适合创建响应式 GUI,或者处理多个短 Web 请求,其中 I/O 比 Python 代码更成为瓶颈。它不适合并行计算密集型 Python 代码,请坚持使用 multiprocessing 模块来执行此类任务或委托(delegate)给专用的外部库。

关于python - Python 支持多线程吗?它可以加快执行时间吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26992428/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com