即使阅读了http://krondo.com/?p=1209Does an asynchronous call always create/call a new thread?,我仍然对如何在固有的单线程系统上提供异步调用感到困惑。到目前为止,我将解释我的理解并指出我的疑问。

我读过的示例之一是描述提供请求的异步处理的TCP服务器-用户将调用例如get(Callback c)和回调将在一段时间后调用。现在,我的第一个问题-我们已经有两个系统,一个服务器和一个客户端。这不是我的意思,因为实际上我们至少有两个线程-一个在服务器上,一个在客户端上。

我读的另一个示例是JavaScript,因为这是带有Node.js的单线程异步系统的最突出示例。如果我执行下面的代码(对于不正确的代码,可能是残酷的语法表示歉意),我可能无法理解,也许是用Java术语来思考:

function foo(){
    read_file(FIle location, Callback c) //asynchronous call, does not block
    //do many things more here, potentially for hours
}

读取文件的调用将执行(返回)并返回,从而使我的函数其余部分得以执行。由于只有一个线程,即一个正在执行我的功能的线程,到底该同一个线程(一个并且只有一个正在执行我的东西)将如何从磁盘读取字节?

基本上,在我看来,我似乎缺少某种底层机制,该机制的作用类似于某种轮循调度程序,它本质上是单线程的,可能会将任务拆分为较小的任务,或者调用会产生线程和线程的多任务组件。读入文件。

预先感谢您的所有评论,并指出我在途中的错误。

更新:感谢您的所有回复。其他有助于我解决此问题的好资料在这里:
  • http://www.html5rocks.com/en/tutorials/async/deferred/
  • http://lostechies.com/johnteague/2012/11/30/node-js-must-know-concepts-asynchrounous/
  • http://www.interact-sw.co.uk/iangblog/2004/09/23/threadless(.NET)
  • http://ejohn.org/blog/how-javascript-timers-work/(计时器的内部功能)
  • http://www.mobl-lang.org/283/reducing-the-pain-synchronous-asynchronous-programming/
  • 最佳答案

    真正的答案是,这取决于您所说的“单线程”。

    多任务处理有两种方法:合作和中断驱动。合作,这就是您引用的其他StackOverflow项目所描述的内容,它要求例程明确放弃处理器的所有权,以便它可以执行其他操作。事件驱动系统通常以这种方式设计。这样做的好处是,它易于管理,并且避免了冲突访问数据的大多数风险,因为任何时候都只有一小段代码正在执行。缺点是,由于一次只能完成一件事情,因此必须将所有内容设计为相当快地执行,或者将其分解为大块(通过诸如yield()调用等显式暂停),否则系统将出现卡住,直到该事件已完全处理。

    另一种方法-线程或进程-主动使处理器远离正在运行的代码块,并在执行其他操作时将其暂停。这实现起来要复杂得多,并且在编码时需要格外小心,因为您现在有同时访问共享数据结构的风险,但是功能更强大,并且做得正确,功能更强大,响应能力更强。

    是的,这两种情况确实都涉及调度程序。在以前的版本中,调度程序只是在旋转直到事件到达(从操作系统和/或运行时环境(隐式为另一个线程或进程)传递)开始,并在处理下一个事件之前分派(dispatch)该事件。

    关于java - 单线程异步处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21263574/

    10-12 00:06
    查看更多