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

标签 asynchronous nonblocking event-driven

我正在尝试理解这些概念

  • 事件驱动
  • 异步
  • 非阻塞 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 语句后恢复并继续对数据执行某些操作。 这是进行非阻塞数据处理的一种方法,但它不是事件驱动的。


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 已刷新,应用程序可以执行所需的任何操作。

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

非阻塞意味着启动监听的线程在事件到达之前不会被阻塞,它会执行任何其他操作。比如同时处理其他事件。

关于asynchronous - 有人可以向我解释一下什么是事件驱动、异步、非阻塞 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66733077/

相关文章:

Ruby Win32Api 获取单字符非阻塞

scala - 什么是事件驱动的并发?

java - 阻塞或非阻塞 - 在 Java 的 HashMap 中重新散列期间添加元素

c# - 在异步操作完成之前从方法返回的坏习惯?

android - 强制我的 Activity 前景?

Swift 单元测试 : async

python - NLTK以非阻塞方式绘制树

javascript - node.js 在 Web 开发环境中的位置在哪里?

c++ - 使用 C++ 进行事件驱动的客户端/服务器设计

Android 异步执行文件操作