关于异步IO的一个疑问

二、协程底层实现原理

  线程是操作系统的内核对象,多线程编程时,如果线程数过多,就会导致频繁的上下文切换,这些 cpu 时间是一个额外的耗费。所以在一些高并发的网络服务器编程中,使用一个线程服务一个 socket 连接是很不明智的。于是操作系统提供了基于事件模式的异步编程模型。用少量的线程来服务大量的网络连接和I/O操作。但是采用异步和基于事件的编程模型,复杂化了程序代码的编写,非常容易出错。因为线程穿插,也提高排查错误的难度。

   协程,是在应用层模拟的线程,他避免了上下文切换的额外耗费,兼顾了多线程的优点。简化了高并发程序的复杂度。举个例子,一个高并发的网络服务器,每一个socket连接进来,服务器用一个协程来对他进行服务。代码非常清晰。而且兼顾了性能。

 

问:

为啥异步IO,因为异步容易导致逻辑错误?

 

异步编程的槽点

  异步编程为了追求程序的性能,强行的将线性的程序打乱,程序变得非常的混乱与复杂。对程序状态的管理也变得异常困难。写过Nginx C Module的同学应该知道我说的是什么。我们开始吐槽 NodeJS 那恶心的层层Callback。

 问:

是因为执行流被拆成了小模块(每次因Req导致阻塞就分割一个小模块),导致无法复盘原作者的思路(原来的完整执行流) ?

 

转自:

https://studygolang.com/articles/20666

posted @ 2020-05-09 10:50  FL1188  阅读(137)  评论(0)    收藏  举报