即使读完之后http://krondo.com/?p=1209 http://krondo.com/?p=1209 or 异步调用是否总是创建/调用新线程? https://stackoverflow.com/questions/598436/does-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
}
对读取文件的调用执行(某物)并返回,从而允许执行我的函数的其余部分。由于只有一个线程,即正在执行我的函数的线程,那么同一个线程(唯一一个正在执行我的东西的线程)究竟如何从磁盘读取字节?
基本上,在我看来,我缺少一些底层机制,它的作用类似于某种循环调度程序,它本质上是单线程的,可能会将任务分割成更小的任务,或者调用一个多线程组件,该组件会生成一个线程并读入文件。
预先感谢所有评论并指出我的错误。
Update: 谢谢大家的回复。帮助我解决这个问题的更多好资源在这里:
- http://www.html5rocks.com/en/tutorials/async/deferred/ http://www.html5rocks.com/en/tutorials/async/deferred/
- http://lostechies.com/johnteague/2012/11/30/node-js-must-know-concepts-asynchronous/ http://lostechies.com/johnteague/2012/11/30/node-js-must-know-concepts-asynchrounous/
-
http://www.interact-sw.co.uk/iangblog/2004/09/23/threadless http://www.interact-sw.co.uk/iangblog/2004/09/23/threadless (.NET)
-
http://ejohn.org/blog/how-javascript-timers-work/ http://ejohn.org/blog/how-javascript-timers-work/(定时器的本质)
- http://www.mobl-lang.org/283/reducing-the-pain-synchronous-asynchronous-programming/ http://www.mobl-lang.org/283/reducing-the-pain-synchronous-asynchronous-programming/
真正的答案是,这取决于“单线程”的含义。
多任务处理有两种方法:协作式和中断驱动式。合作,也就是您引用的另一个 StackOverflow 项目所描述的,要求例程显式放弃处理器的所有权,以便它可以执行其他操作。事件驱动系统通常是这样设计的。优点是它更容易管理,并且避免了数据访问冲突的大部分风险,因为在任何时候只有一小块代码被执行。缺点是,因为一次只做一件事,所以所有事情都必须设计得相当快地执行,或者分成多个块(通过像yield()
调用),否则系统将出现冻结状态,直到该事件被完全处理为止。
另一种方法——线程或进程——主动让处理器停止运行代码块,在完成其他事情时暂停它们。这实现起来要复杂得多,并且在编码时需要更加小心,因为您现在面临同时访问共享数据结构的风险,但它更强大,而且(如果做得正确)更加健壮和响应迅速。
是的,这两种情况确实都涉及一个调度程序。在以前的版本中,调度程序只是旋转,直到事件到达(从操作系统和/或运行时环境传递,这隐式是另一个线程或进程),并在处理下一个到达的事件之前调度该事件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)