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

Multithreading 异步和调度-库如何避免在最低级别阻塞?,multithreading,asynchronous,nonblocking,fibers,green-threads,Multithreading,Asynchronous,Nonblocking,Fibers,Green Threads,我已经使用各种并发结构有一段时间了,但我没有考虑所有这些神奇的事情是如何发生的,这最近让我越来越不安 为了弥补这一点。。。感觉上,我一直在阅读async如何在引擎盖下工作。当我说async时,在本例中我指的是userland/greenthread/cooperative multitasking,尽管我假设其中一些概念也适用于传统操作系统管理的线程,因为涉及到调度器和工作线程 我知道一个工作进程如何挂起自己并让其他工作进程执行,但在非阻塞库代码的最低级别,调度程序如何知道以前挂起的工作进程何时

我已经使用各种并发结构有一段时间了,但我没有考虑所有这些神奇的事情是如何发生的,这最近让我越来越不安

为了弥补这一点。。。感觉上,我一直在阅读async如何在引擎盖下工作。当我说async时,在本例中我指的是userland/greenthread/cooperative multitasking,尽管我假设其中一些概念也适用于传统操作系统管理的线程,因为涉及到调度器和工作线程

我知道一个工作进程如何挂起自己并让其他工作进程执行,但在非阻塞库代码的最低级别,调度程序如何知道以前挂起的工作进程何时完成并唤醒该工作进程?

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

  • 现在我们有异步代码调用其他异步库代码,现在我再次问自己这个问题-异步库代码如何知道何时暂停和恢复操作?

对我来说,启动HTTP请求、继续前进并稍后返回检查结果的想法很奇怪——不是从概念上,而是从实现的角度考虑

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

现在我们是另一层,您使用套接字选择来避免创建线程和阻塞,但是,再一次

  • 这些套接字如何启动操作,在完成之前继续,然后select如何知道数据何时可用
  • 您是否一直在检查一些缓冲区,以查看字节是否已在无限循环中传递,如果没有,则继续
不管怎样,我想你知道我要去哪里了

我主要关注HTTP作为一个激励性的例子,但同样的问题也适用于任何正常的阻塞操作-它在底部是如何工作的?

以下是我在研究该主题时发现的一些有用的资源,它们为这个问题提供了信息:

  • David Beazley的精彩视频中,他带领您完成了一个简单的调度器实现,该调度器通过在等待队列中休眠来触发回调并暂停执行。我发现这段视频非常有启发性,但它的结尾有点短,因为它向您展示了如何使用异步睡眠释放调度程序来执行其他工作程序,但并没有真正探讨当您调用这些工作程序中的代码时会发生什么,这些工作程序本身必须是非阻塞的,这样它才能很好地与调度程序配合

  • -这使我的理解更进一步,但仍有一些不确定性


我看到投票即将结束——我是否应该对这个问题进行一些修改,使其更为恰当?看看如何安排goroutines。可用的文档很好地涵盖了您的问题。我看到投票结束-我是否应该对问题进行一些更改以使其更合适?看看如何安排goroutines。可用的文档很好地涵盖了您的问题。