不久前,Herb写了免费午餐结束:软件中的并发性的根本转变,我的基本解释是,为了提高性能,软件工程师将不得不接受并发的,特别是多线程程序。
当我第一次阅读这篇文章时,我想我必须提高对线程的理解,但是现在有了许多现代语言中的async代码。
我们是否认为异步代码的本机实现使得拥抱并发或多线程变得更容易,因为我们只需要使用语言提供的异步代码来利用芯片上的多个核?
发布于 2021-06-25 22:25:29
异步/等待是关于更有效地等待,而不是真正地提高CPU性能。这恰好允许您更有效地利用内核,但更多的是高效地执行I/O:当一个任务等待IO操作完成时,另一个挂起的任务可以运行。这与萨特2005年关于单核系统局限性的文章没有什么关系。异步/等待与多线程无关。
有并发性和并行性。并行性是指同时进行的计算。并发性是指不按顺序进行计算。虽然并行性是一种并发性,但另一种并发模型是计算是交错的。
异步/等待允许这样的高效交织:执行器或事件循环跟踪已完成的IO任务和其他事件,并调度依赖的任务以适当地运行。这可以在没有线程开销的情况下实现,特别是不需要涉及操作系统(相对来说比较慢)。如果没有这样的执行器,线程将花费大部分时间等待事件的发生。这与服务器软件特别相关:传统上,服务器将有一个工作线程池,例如2×核数。这就限制了可以在任何时候“飞行”的任务的数量。有了异步执行器,我可以拥有与核心完全相同的线程,但它们可以在内存中处理尽可能多的异步任务。因此,一个单一的web服务器可以同时处理数千个并发(但不是并行的!)请求。
Python有点特殊,因为CPython的全局解释器锁(GIL)阻止了真正的并行性。在这里,异步/等待有助于将更多的IO绑定任务打包到当前可以运行的单个Python线程中。CPU绑定的Python程序使用多个内核的唯一方法是调用C代码来管理自己的线程(例如,使用OpenMP),或者运行多个Python进程。在Python引入异步/等待语法之前,可以使用yield (生成器)对其进行仿真,这也是单线程上的一种交错计算。
语言级异步/等待的真正优势在于它使并发代码更容易思考。当一个函数awaits时,很明显,一个不同的任务可能会在那个点运行。但是在等待之间,它的行为就像传统的、非并发的代码。如果没有异步/等待,我们将不得不使用回调或事件侦听器,这很难很好地构造。间接地,这也有助于编写更好的并行软件。但是异步模型并不是关于并行化,而是关于高效地交织单独的计算--不是关于更快的计算,而是关于使用相同的资源做更多的事情。
https://softwareengineering.stackexchange.com/questions/429714
复制相似问题