Questions tagged «nonblocking»

非阻塞模式I / O至少传输一个字节,或者在出现错误或流结束时立即返回。非阻塞算法是指在没有通常的互斥原语的情况下使用并发,从而确保线程操作不会无限期地阻塞。这通常通过原子值修改(递增/递减)和/或读取(比较和交换)操作来处理。目前尚不清楚此标记的用途。

30
在Python中对子进程进行非阻塞读取
我正在使用子流程模块来启动子流程并连接到其输出流(stdout)。我希望能够在其stdout上执行非阻塞读取。有没有一种方法可以使.readline无阻塞或在调用之前检查流中是否有数据.readline?我希望这是可移植的,或者至少要在Windows和Linux下工作。 这是我目前的操作方式(.readline如果没有可用数据,则会阻塞): p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE) output_str = p.stdout.readline()

16
可以异步调用jdbc吗?
我想知道是否有一种方法可以对数据库进行异步调用吗? 例如,假设我有一个很大的请求,需要很长时间来处理,我想发送请求并在请求将返回值时(通过传递侦听器/回调等)接收通知。我不想阻止等待数据库答复。 我不认为使用线程池是一种解决方案,因为它无法扩展,在大量并发请求的情况下,这会产生大量线程。 我们正面临着网络服务器的此类问题,并且已经找到解决方案,方法是使用select / poll / epoll系统调用来避免每个连接只有一个线程。我只是想知道如何在数据库请求中具有类似的功能? 注意:我知道使用FixedThreadPool可能是一个不错的解决方法,但令我惊讶的是,没有人开发出真正异步的系统(无需使用额外的线程)。 **更新** 由于缺少实际可行的解决方案,我决定自己创建一个库(finagle的一部分):finagle-mysql。它基本上解码/解码mysql请求/响应,并在后台使用Finagle / Netty。即使有大量连接,它的扩展性也非常好。

9
在C#中最简单的方法来解决问题?
我在WCF中看到它们具有[OperationContract(IsOneWay = true)]属性。但是WCF似乎只是为了创建一个非阻塞函数而缓慢而繁重。理想情况下,会出现诸如static void nonblocking之类的东西MethodFoo(){},但我认为这不存在。 在C#中创建非阻塞方法调用的最快方法是什么? 例如 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中工作)
150 c#  .net  nonblocking 


9
非阻塞I / O真的比多线程阻塞I / O快吗?怎么样?
我在网上搜索了有关阻止I / O和非阻止I / O的一些技术细节,我发现一些人指出,非阻止I / O比阻止I / O更快。例如在本文档中。 如果我使用阻塞I / O,那么当前被阻塞的线程当然不能做任何其他事情……因为它被阻塞了。但是,一旦某个线程开始被阻塞,操作系统就可以切换到另一个线程,而不必切换回另一个线程,直到对该阻塞的线程有必要做些事情为止。因此,与基于事件的非阻塞方法相比,只要系统上还有另一个线程需要CPU并且未被阻塞,那么CPU空闲时间就不会更多了? 除了减少CPU空闲时间以外,我还看到了另一个选择,可以增加计算机在给定时间范围内可以执行的任务数量:减少切换线程带来的开销。但是如何做到这一点?开销是否足够大以显示可衡量的效果?这是关于如何描述其工作原理的想法: 要加载文件的内容,应用程序将此任务委托给基于事件的I / O框架,并传递回调函数和文件名。 事件框架委托给操作系统,该操作系统对硬盘的DMA控制器进行编程,以将文件直接写入内存 事件框架允许进一步的代码运行。 在完成磁盘到内存的复制后,DMA控制器将引起中断。 操作系统的中断处理程序将基于事件的I / O框架通知文件已完全加载到内存中。它是如何做到的?使用信号?? 事件I / O框架中当前运行的代码完成。 基于事件的I / O框架检查其队列,并查看步骤5中的操作系统消息,并执行在步骤1中获得的回调。 那是怎么回事?如果没有,它如何工作?这意味着事件系统可以工作而无需显式地触摸堆栈(例如,真正的调度程序需要在切换线程时备份堆栈并将另一个线程的堆栈复制到内存中)?这实际上节省了多少时间?还有更多吗?

2
什么时候以及如何使用龙卷风?什么时候没用?
好的,Tornado是非阻塞的,而且运行速度非常快,它可以轻松地处理许多常规请求。 但是我想这不是灵丹妙药,如果我们仅仅使用Tornado盲目地运行基于Django的站点或其他任何站点,它都不会提高性能。 我找不到对此的全面解释,所以我在这里问它: 什么时候应该使用龙卷风? 什么时候没用? 使用时,应考虑什么? 我们如何使用龙卷风打造低效的网站? 有一个服务器和一个网络框架。我们什么时候应该使用框架,什么时候可以用其他框架替换它?

5
异步,非阻塞,基于事件的体系结构之间有什么区别?
之间有什么区别: 异步, 非阻塞,和 基于事件的架构? 事物既可以是异步的又可以是非阻塞的(基于事件的)吗? 在编程中,最重要的是要拥有一些东西:异步,非阻塞和/或基于事件的(或全部基于3个)? 如果您可以提供示例,那就太好了。 有人问这个问题是因为我在阅读有关类似主题的出色StackOverflow文章,但没有回答我上面的问题。

10
C无阻塞键盘输入
我正在尝试使用C语言编写一个程序(在Linux上),直到用户按下某个键为止,该程序才会循环运行,但不要求按键即可继续每个循环。 有没有简单的方法可以做到这一点?我认为我可以做到,select()但这似乎需要大量工作。 另外,有没有办法在程序关闭之前捕获ctrl-c按键进行清理,而不是非阻塞io?

5
非阻塞IO与异步IO以及Java实现
尝试为自己总结这两个概念之间的区别(因为当我看到人们在一句话中同时使用这两个概念时,我感到非常困惑,例如“ Non-blocking async IO”,我试图弄清楚它是做什么的)意思)。 因此,以我的理解,无阻塞IO是操作系统的主要机制,如果有任何可用数据,则该OS处理IO,否则仅返回错误/不执行任何操作。 在异步IO中,您仅提供回调,当数据可用时,系统将通知您的应用程序。 那么,实际上什么是“非阻塞异步IO”?以及如何在Java中实现它们(标准JDK,没有外部库,我知道有java.nio.channels.{Channels, Selector, SelectorKey}和java.nio.channels.{AsynchronousSocketChannel}):非阻塞IO,异步IO和非阻塞异步IO(如果有的话)?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.