jus*_*mer 5 language-agnostic asynchronous
我一直听说使用异步编程模式会让我的代码运行得更快.为什么这是真的?不管是现在运行还是以后运行,都不能以相同的方式运行相同的代码?
它并不快,它只是不浪费时间.
同步代码在等待I/O时停止处理.这意味着当您阅读文件时,您无法运行任何其他代码.现在,如果在读取该文件时没有别的事可做,那么异步代码就不会给你带来任何好处.
通常,您可以使用的额外CPU时间对服务器很有用.所以问题是为什么异步编程而不是为每个客户端启动新线程?
事实证明,启动和拆除螺纹是昂贵的.早在21世纪初,一个Web服务器基准测试发现tclhttpd与Apache相比,可以提供静态图像文件.尽管事实上tclhttpd是用tcl编写的,而Apache是用C语言编写的,并且知道tcl比C慢50倍.由于tcl有一个易于使用的异步I/O API,因此Tcl设法保持自己对抗Apache.所以tclhttpd使用它.
并不是C没有异步I/O API.只是他们很少使用.所以Apache没有使用它.目前,Apache2在内部使用异步I/O以及线程池.C代码看起来更复杂,但速度更快 - 经验教训.
这引导我们最近对异步编程的痴迷.为什么人们痴迷于此?(例如关于javascript编程的Stackoverflow上的大多数答案坚持认为你永远不应该使用异步函数的同步版本).
这可以追溯到你很少看到C语言中的异步程序,即使它是最好的处理方式(GUI代码是一个例外,因为UI库早期学习依赖于异步编程和事件).C语言中有太多同步的函数.因此,即使你想进行异步编程,你最迟还是会调用同步函数.另一种方法是放弃stdlib并为所有内容编写自己的异步库 - 从文件I/O到网络到SQL.
因此,在像异步编程最终作为默认样式的javascript这样的语言中,来自其他程序员的压力不会搞砸并意外地引入同步函数,这些函数很难与异步代码集成而不会失去很多性能.所以最后,像税收一样,异步代码已经成为一种社会契约.
它并不总是更快。事实上,仅仅设置和拆除异步环境就会为您的代码增加大量时间。您必须分离出一个新的进程/线程,设置一个事件队列/消息泵,并在最后很好地清理所有内容。(即使您的框架对您隐藏了所有这些细节,它们也会在后台发生)。
优点是阻塞。我们的很多代码依赖于外部资源。我们需要查询数据库以获取要处理的记录,或者从网站下载最新版本的内容。从您向该资源询问信息到得到答案,您的代码与此无关。它正在阻塞,等待答案。你的程序花在阻塞上的所有时间都完全被浪费了。
这就是 async 的设计目的。通过将“等待此阻塞操作”代码转为异步请求,您可以让其余的非阻塞代码继续运行。
作为一个比喻,想象一位经理告诉他的员工那天要做什么。其中一项任务是给等待时间很长的公司打电话。如果他让她同步拨打电话,她将拨打电话并等待,不做任何其他事情。让它异步,她可以在手机在后台等待时处理许多其他任务。
| 归档时间: |
|
| 查看次数: |
3388 次 |
| 最近记录: |