首页 > 编程知识 正文

异步io需要保证顺序吗,哪种情况用异步io

时间:2023-05-05 07:18:21 阅读:111285 作者:4903

在IO编程部分,我们发现CPU比磁盘和网络等IO快得多。 在线程中,CPU执行代码的速度非常快,但是如果发生I/o操作(如读写文件或发送网络数据),则在继续下一操作之前必须等待I/o操作完成。 这种情况称为同步IO

在I/o处理期间,当前线程将挂起,需要CPU执行的其他代码将无法在当前线程上执行。

一个I/o操作会阻止当前线程,使其他代码无法执行,因此必须使用多线程或多进程同时运行代码并为多个用户提供服务。 每个用户都有一个线程,如果线程遇到IO而挂起,则其他用户的线程不会受到影响。

多线程和多进程模型可以解决并发问题,但系统无法无限增加线程。 由于系统切换线程的开销也很大,过多的线程会占用大量的CPU时间来切换线程,导致代码实际执行时间减少,从而导致性能大幅降低。

我们要解决的问题是CPU的高速执行能力和IO设备的龟速严重不匹配,所以多线程和多进程只是解决这个问题的一种方法。

另一种解决IO问题的方法是异步IO。 如果代码需要执行耗时的I/o操作,则只需发出I/o命令即可执行其他代码,而不等待I/o结果。 稍后,IO返回结果时,会通知CPU处理。

可以想象,用普通顺序编写的代码实际上不可能完成异步IO。

do _ some _ code (f=open (/path/to/file ),(r ) ) (r=f.read ) )=线程现在停止,直到IO操作的结果# IO操作完成为止,线程为3360 do

loop=get _ event _ loop (while true : event=loop.get _ event ) process_event ) event )消息模型实际上是桌面APP情况GUI程序的主线程不断负责读取和处理消息。 所有键盘、鼠标等消息都发送到GUI程序的消息队列,并由GUI程序的主线程进行处理。

用户为非常快,因为GUI线程处理键盘、鼠标等消息的速度为感觉不到延迟。 有时,GUI线程在处理一个消息的过程中出现问题,导致一次处理消息的时间过长,这时用户会觉得整个GUI程序都没有响应,敲击键盘、单击鼠标都没有反应。 这表明,在消息模型中,必须非常快速地处理一条消息。 否则,主线程将无法立即处理消息队列中的其他消息,程序似乎停止响应。

消息模型如何解决同步IO必须等待IO操作的问题呢? 发生IO操作时,代码只负责发布IO请求,不等待IO结果,直接结束本轮消息处理,进入下一个消息处理流程。 I/o操作完成后,将显示“I/o完成”消息,您可以在处理过程中直接获取I/o操作的结果。

从提交IO请求到接收IO完成,同步IO模型中的主线程只会挂起,而异步IO模型中的主线程不会休息,而是继续在消息吉鲁中处理其他消息。 因此,在在异步IO模型下,一个线程就可以同时处理多个IO请求中,没有切换线程的操作。 在大多数IO密集型APP应用中,异步IO大大提高了系统的多任务处理能力。

画小丑的画:

原作指甲这里kkdxgz博客

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。