gpt4 book ai didi

Python:异步相对于线程的优势是什么?

转载 作者:太空狗 更新时间:2023-10-29 17:50:44 24 4
gpt4 key购买 nike

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

3年前关闭。




Improve this question




我很难理解异步功能如何以及为什么在 python 中工作,但我仍然不确定我是否正确理解了所有内容(尤其是“为什么”部分)。如果我错了,请纠正我。

异步方法和线程的目的是使并发处理多个任务成为可能。

线程方法看起来简单直观。如果python程序并发处理多个任务,我们每个任务都有一个线程(可能带有子线程),每个线程的堆栈反射(reflect)了相应任务的当前处理阶段。一切都很简单,有易于使用的机制来启动一个新线程并等待它的结果。

据我了解,这种方法的唯一问题是线程很昂贵。

另一种方法是使用 async协程。我可以看到这种方法有几个不便之处。我只会说出其中的几个。我们现在有两种类型的方法:普通方法和 async方法。 90%的时候唯一的区别就是你需要记住这个方法是async并且不要忘记使用 await调用此方法时的关键字。是的,您不能调用 async从正常的方法。而这一切async - await程序周围的语法垃圾只是表明该方法能够将控制权交给消息循环。

线程方法没有所有这些不便。但是async - await方法允许处理比线程方法多得多的并发任务。这怎么可能?

对于每个并发任务,我们仍然有一个调用堆栈,只是现在它是一个协程调用堆栈。我不太确定,但看起来这是关键的区别:通常的堆栈是操作系统堆栈,它们很昂贵,协程堆栈只是一个 python 结构,它们便宜得多。这是我的理解正确吗?

如果这是正确的,将python线程/调用堆栈与操作系统线程/调用堆栈分离以使python线程更便宜不是更好吗?

对不起,如果这个问题很愚蠢。我肯定有一些原因async - await方法被选中。只是想了解这些原因。

更新:

对于那些不认为这个问题不好且过于宽泛的人。

这是一篇文章Unyielding - 首先解释为什么线程不好并做广告async方法。主要论文:线程是邪恶的,很难推理一个可以从任意数量的线程并发执行的例程。

感谢 Nathaniel J. Smith(python Trio 库的作者)建议此链接。

顺便说一句,文章中的论点对我来说没有说服力,但仍然可能有用。

最佳答案

This article回答您的问题。

特尔;博士?

Python 中的线程效率低下,因为 GIL (全局解释器锁)这意味着多个线程不能像您在多处理器系统上期望的那样并行运行。此外,您必须依靠解释器在线程之间切换,这增加了低效率。

异步/asyncio允许在单个线程内并发。这使您作为开发人员可以对任务切换进行更细粒度的控制,并且可以为并发 I/O 绑定(bind)任务提供比 Python 线程更好的性能。

您没有提到的第三种方法是 multiprocessing .这种方法使用进程进行并发,并允许程序充分利用具有多核的硬件。

关于Python:异步相对于线程的优势是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48020593/

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