曾几何时,我碰到了Indy的文章介绍,从那以后就不能停止思考封锁与非封锁的IO。 寻找一些很好的文章来描述阻塞IO和非阻塞IO的优点和缺点,以及如何在每种情况下devise你的应用程序以获得自然,容易理解和易于维护的代码。 想了解BIG图片…
这是我的问题。 我实现了一个小脚本,做了一些繁重的计算,就像一个node.js模块。 所以,如果我input“node myModule.js”,它会计算一秒,然后返回一个值。 现在,我想从我的主Node.JS程序中使用该模块。 我可以把所有的计算都放在“doSomeCalculation”函数中,然后: var myModule = require("./myModule"); myModule.doSomeCalculation(); 但是那样会阻塞,所以会很糟糕。 我想以非阻塞的方式使用它,比如本地的DB调用。 所以我试图使用child_process.spawn和exec,像这样: var spawn = require("child_process").spawn; var ext = spawn("node ./myModule.js", function(err, stdout, stderr) { /* whatevs */ }); ext.on("exit", function() { console.log("calculation over!"); }); 但是,当然,这是行不通的。 我尝试在myModule中使用EventEmitter,发出“calculateDone”事件,并试图在上例中的“ext”variables上添加关联的侦听器。 依然不起作用。 至于叉子,他们并不是我想要做的。 叉子需要把与计算有关的代码放在主程序中,在父母做它所做的事情的时候,把孩子分叉,计算,然后我将如何返回结果? 所以这里是我的问题:我可以使用subprocess来做一些非阻塞计算,当计算放在一个节点文件,或者是不可能的? 我应该在Python脚本中进行繁重的计算吗? 在这两种情况下,我如何将parameter passing给subprocess – 例如,一个图像?
我怎样才能从控制台python应用程序轮询键盘? 具体来说,我想在很多其他I / O活动(套接字select,串口访问等)中做类似的事情: while 1: # doing amazing pythonic embedded stuff # … # periodically do a non-blocking check to see if # we are being told to do something else x = keyboard.read(1000, timeout = 0) if len(x): # ok, some key got pressed # do something 什么是在Windows上这样做的正确pythonic方式? 而且,Linux的可移植性不会太差,尽pipe这不是必需的。
有什么区别: asynchronous , 不阻塞 ,和 基于事件的体系结构? 可以是asynchronous和非阻塞 (和基于事件的 )? 什么是最重要的编程,有一些东西:asynchronous,非阻塞和/或事件的基础(或所有3)? 如果你能提供例子,那就太好了。 这个问题被问到,因为我正在阅读这个伟大的StackOverflow文章上类似的话题,但它不回答我上面的问题。
好吧,龙卷风是非阻塞的,速度相当快,它可以很容易地处理很多站立要求。 但我猜这不是一个银弹,如果我们只是盲目地运行基于Django或其他网站与龙卷风,它不会给任何性能提升。 我找不到全面的解释,所以我在这里问: 什么时候应该使用龙卷风? 什么时候没用? 使用时应该考虑什么? 我们怎样才能使低迷的网站使用龙卷风? 有一个服务器和一个networking框架。 我们什么时候应该使用框架,什么时候可以用另一个replace?
我在网上search了关于阻塞I / O和非阻塞I / O的一些技术细节,我发现有几个人说非阻塞I / O比阻塞I / O要快。 例如在这个文件中 。 如果我使用阻塞I / O,那么当前阻塞的线程无法做其他任何事情…因为阻塞了。 但是一旦一个线程开始被阻塞,操作系统就可以切换到另一个线程并且不会切换回来,直到被阻塞的线程有一些事情要做。 所以只要系统上有另一个线程需要CPU而没有被阻塞,与基于事件的非阻塞方法相比,CPU不应该有更多的空闲时间。 除了减lessCPU闲置的时间之外,我还可以看到另外一个选项来增加计算机在给定的时间范围内可以执行的任务数量:减less切换线程引起的开销。 但是,这怎么办呢? 是否有足够的开销来显示可衡量的影响? 这里是一个想法,我可以如何描绘它的工作: 为了加载文件的内容,应用程序将这个任务委托给基于事件的I / O框架,传递一个callback函数以及一个文件名 事件框架委托给操作系统,该操作系统对硬盘的DMA控制器进行编程,以将文件直接写入存储器 事件框架允许运行更多的代码。 完成磁盘到内存的复制后,DMA控制器会引起中断。 操作系统的中断处理程序通知基于事件的I / O框架文件被完全加载到内存中。 它是如何做到的? 使用信号? 当前在事件I / O框架中运行的代码完成。 基于事件的I / O框架检查其队列,并从步骤5看到操作系统的消息,并执行步骤1中获得的callback。 这是如何工作的? 如果没有,它是如何工作的? 这意味着事件系统可以工作,而不需要明确地触摸堆栈(比如真正的调度器,在切换线程时需要备份堆栈并将另一个线程的堆栈复制到内存中)? 这实际上保存多less时间? 还有更多吗?
我在WCF看到他们有[OperationContract(IsOneWay = true)]属性。 但是WCF似乎有点缓慢和沉重,只是为了创build一个非阻塞函数。 理想情况下,会有像静态无MethodFoo(){} ,但我不认为这存在。 在C#中创build非阻塞方法调用的最快方法是什么? 例如 class Foo { static void Main() { FireAway(); //No callback, just go away Console.WriteLine("Happens immediately"); } static void FireAway() { System.Threading.Thread.Sleep(5000); Console.WriteLine("5 seconds later"); } } 注意 :每个人都应该考虑一下,如果他们真的想要完成这个方法的话。 (请参阅#2最佳答案)如果方法必须完成,那么在某些地方,如ASP.NET应用程序,您将需要执行一些操作来阻止并保持线程处于活动状态。 否则,这可能导致“遗忘但从未实际执行”,在这种情况下,根本不写任何代码会更简单。 ( 这是如何在ASP.NET中工作的一个很好的描述 )
在服务器端Javascript引擎的上下文中,什么是非阻塞I / O或asynchronousI / O? 我认为这被认为是Java服务器端实现的一个优势。
我试图编写一个C程序(在Linux上),循环直到用户按下一个键,但不应该需要按键来继续每个循环。 有一个简单的方法来做到这一点? 我想我可以用select()来做,但是这似乎很多工作。 或者,有没有办法赶上一个ctrl – c按键清理之前,程序关闭,而不是非阻塞io?