协程的问题的疑问?
协程,有些语言本身就支持协程特性,使用了之后,整个机器的QPS可以提升,但是正常的一个请求的响应时间并未缩短吧(正常请求,我指的就是一个 HTTP API,这个api内部涉及到了多次与mysql或者redis交互或者其他网路通讯),请求解答,谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
协程,有些语言本身就支持协程特性,使用了之后,整个机器的QPS可以提升,但是正常的一个请求的响应时间并未缩短吧(正常请求,我指的就是一个 HTTP API,这个api内部涉及到了多次与mysql或者redis交互或者其他网路通讯),请求解答,谢谢
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(1)
QPS提高的主要原因是IO并发度的提高,并不改变单次IO的响应时间。提高IO并发主要是通过异步或者说非阻塞式IO实现的(底层对应于epoll、kqueue等机制),这并不一定要用到协程,其实一些异步编程框架也能做到。
协程的主要优势是在高并发的前提下,还保持类似同步编程的特性,使得程序本身更容易理解和维护;同时避免直接使用OS线程引入的线程创建、切换的开销。
以Go为例,一个goroutine在对某个socket进行read或write操作时,会默认采用nonblock的方式,返回EAGAIN后会将这次操作加入一个IO任务队列(底层epoll、kqueue等),然后将当前goroutine挂起,调度器再切换其他就绪的goroutine执行。一个后台线程会定期调用epoll等系统调用检测IO队列状态,一旦对应的socket可用,再重新唤醒挂起的goroutine。由于goroutine间的切换是在用户态下实现的,因此开销很小;同时runtime将上述过程隐藏,使程序员编写程序时就如同之前调用阻塞IO时一样,保持了编程的简洁性。