异步和调度-库如何避免最低级别的阻塞?

问题描述

一段时间以来,我一直在使用各种并发构造,而没有过多考虑所有魔术的发生方式,这最近使我变得越来越不安。

为了纠正这种感觉,我一直在阅读异步引擎的工作原理。当我说异步时,在这种情况下,我指的是userland / greenthread /合作多任务处理,尽管我假设某些概念在涉及调度程序和工作程序的范围内也适用于传统的OS托管线程。

我看到一个工作人员如何暂停自己的工作并让其他工作人员执行,但是在非阻塞库代码的最低级别,调度程序如何知道何时执行先前暂停的工作人员的工作并将其唤醒工人?

  • 例如,如果您在某种异步块中启动了一个工作程序并执行了通常会阻塞的操作(例如,HTTP请求,SQL查询,其他I / O),那么即使您的调用代码是异步的,则该操作(库代码)最好与异步框架配合使用,或者您已经有效地挫败了使用它的目的,并阻止调度程序在等待阻塞时调用其他等待操作(What Color is Your Function问题)调用(已在您的非阻塞调用代码中执行)完成。

  • 因此,现在我们有了异步代码来调用其他异步库代码,现在我又要问自己一个问题-异步库代码如何知道何时暂停和恢复操作?

激发HTTP请求,继续前进并稍后返回以检查结果的想法对我来说很奇怪-从概念上而不是从实现的角度来看。

如何执行部分操作,例如发送TCP数据包,然后继续执行程序的其余部分,直到稍后返回并检查结果是否已交付。交付给什么?一个插座?

现在我们又深入了一层,您正在使用套接字选择以避免创建线程和阻塞,但是,再次...

  • 这些套接字如何开始操作,在完成之前继续前进,然后选择如何知道何时可用数据?
  • 您是否正在不断检查某些缓冲区以查看字节是否已在无限循环中传递并继续传递?

反正-我想你知道我要去这里....

我主要将HTTP用作激励示例,但是同一问题也适用于任何正常阻塞的操作-它们如何在底部完全起作用?

以下是我在研究该主题时发现有帮助的一些资源,这些资源有助于解决此问题:

  • David Beazley的精彩视频Build Your Own Async,其中带您逐步了解调度程序的简单实现,该调度程序通过在等待的队列中休眠来触发回调并中止执行。我发现这段视频非常有启发性,但是它停了一下,它向您展示了如何使用异步睡眠释放调度程序来执行其他工作程序,但是并没有真正涉及到在这些工作程序中调用代码时会发生的情况本身必须是非阻塞的,以便与调度程序一起很好地工作。

  • How does non-blocking IO work under the hood-这使我对理解有了进一步的了解,但仍然存在一些不确定性。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...