微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有人可以向我解释什么是事件驱动的、异步的、非阻塞的 I/O

如何解决有人可以向我解释什么是事件驱动的、异步的、非阻塞的 I/O

我正在尝试理解这些概念

  • 事件驱动
  • 异步
  • 非阻塞 I/O

解决方法

想象一下你用这个伪代码从一个套接字中读取数据

void processIO(socket)
{
   data = socket.read();
   doSomething(data);
}

read 方法用于阻塞模式。这意味着它在读取数据之前不会继续。正在运行的线程被阻塞并且在读取数据之前不会继续。 doSomething 仅在读取数据后调用。如果您在应用的主线程上执行此操作,它可能无法更新其 UI,并且在收到数据之前会表现得像冻结一样。


async void processIO(socket)
{
   data = await socket.readAsync();
   doSomething(data);
}

这个函数是异步的,它本身调用一个异步的 readAsync() 方法。 这样,它运行的线程就不会被阻塞。它在 await 语句处被中断,并且可供您应用程序中的其他内容运行。一旦数据被读取,它会在 await 语句之后恢复并继续对数据做一些事情。 这是进行非阻塞数据处理的一种方式,但它不是事件驱动的。


void setupRead(socket)
{
   socket.on_data(do_something);
}

void do_something(data) 
{
  // process data
}

void main()
{
   socket = new Socket(111)
   setupRead(socket)
   while (true) {
      processEvents()
   }
}

最后一个示例演示了事件驱动的 IO。当某些数据到达时,您在要调用的某些资源上注册回调。与此同时,您的代码可能会做其他事情或什么都不做。这是一种非阻塞、异步和事件驱动的方法。用户界面得到刷新,应用可以做任何它需要的事情。

事件驱动,意味着您设置事件回调并等待事件发生。 异步意味着,您可以在等待的同时做其他事情,例如刷新 UI、处理用户输入或从其他资源读取写入。

非阻塞意味着开始侦听的线程在事件到达之前不会被阻塞,它会做任何其他需要做的事情。如同时处理其他事件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?