我正在使用子进程模块启动子进程并连接到它的输出流(stdout).我希望能够在其标准输出上执行非阻塞读取.有没有办法让.readline非阻塞或在我调用之前检查流上是否有数据.readline?我希望这是可移植的,或至少在Windows和Linux下工作.
这是我现在如何做到的(.readline如果没有数据可用,则阻止它):
p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE)
output_str = p.stdout.readline()
Run Code Online (Sandbox Code Playgroud) 我想知道是否有办法对数据库进行异步调用?
例如,假设我有一个需要很长时间才能处理的大请求,我想发送请求并在请求返回值时接收通知(通过传递监听器/回调或其他东西).我不想阻止等待数据库回答.
我不认为使用线程池是一种解决方案,因为它不能扩展,在繁重的并发请求的情况下,这将产生大量的线程.
我们正面临网络服务器的这种问题,我们通过使用select/poll/epoll系统调用找到了解决方案,以避免每个连接有一个线程.我只是想知道如何在数据库请求中使用类似的功能?
注意:我知道使用FixedThreadPool可能是一个很好的解决办法,但我很惊讶没有人开发出一个真正异步的系统(没有使用额外的线程).
**更新**
由于缺乏真正实用的解决方案,我决定自己创建一个库(finagle的一部分):finagle-mysql.它基本上解码/解码mysql请求/响应,并在引擎盖下使用Finagle/Netty.即使有大量的连接,它也能很好地扩展.
我在WCF中看到他们有[OperationContract(IsOneWay = true)]属性.但是WCF似乎有点缓慢而且很重要,只是为了创建一个非阻塞功能.理想情况下会出现类似静态无效的阻塞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");
}
}
Run Code Online (Sandbox Code Playgroud)
注意:阅读此内容的每个人都应该考虑他们是否真的想要完成这个方法.(参见#2最佳答案)如果方法必须完成,那么在某些地方,比如ASP.NET应用程序,你需要做一些事情来阻止并保持线程活着.否则,这可能会导致"忘记但永远不会实际执行",在这种情况下,当然,根本不编写任何代码会更简单.(很好地描述了它在ASP.NET中的工作原理)
在服务器端Javascript引擎的上下文中,什么是非阻塞I/O或异步I/O?我认为这被提到是优于Java服务器端实现的优势.
我在网上搜索了一些关于阻止I/O和非阻塞I/O的技术细节,我发现有几个人说非阻塞I/O比阻塞I/O更快.例如,在本文档中.
如果我使用阻塞I/O,那么当然阻塞的线程当然不会做任何其他事情......因为它被阻止了.但是一旦线程开始被阻塞,操作系统就可以切换到另一个线程而不会切换回来,直到阻塞的线程有事情要做.因此,只要系统上有另一个需要CPU并且没有被阻塞的线程,与基于事件的非阻塞方法相比,不应该有更多的CPU空闲时间,是吗?
除了减少CPU空闲时间之外,我还看到了另外一个选项,可以增加计算机在给定时间范围内可以执行的任务数量:减少切换线程所带来的开销.但是怎么做呢?并且开销是否足以显示可衡量的影响?以下是关于如何将其工作的想法:
它是如何工作的?如果没有,它是如何工作的?这意味着事件系统可以在不需要显式触摸堆栈的情况下工作(例如需要备份堆栈并在切换线程时将另一个线程的堆栈复制到内存中的真实调度程序)?这实际节省了多少时间?还有更多吗?
好吧,Tornado是非阻塞的,非常快,它可以轻松处理很多常备请求.
但我想这不是一个银弹,如果我们盲目地运行基于Django或任何其他Tornado网站,它将不会给任何性能提升.
我找不到对此的全面解释,所以我在这里问:
有什么区别:
可以是异步和非阻塞(以及基于事件的)吗?
在编程中最重要的是拥有一些东西:异步,非阻塞和/或事件库(或全部3)?
如果你能提供一些例子,那就太棒了.
这个问题正在被问到,因为我正在阅读关于类似主题的这篇伟大的StackOverflow文章,但它没有回答我上面的问题.
asynchronous programming-languages event-based-programming nonblocking blocking
我正在尝试用C语言编写一个程序(在Linux上)循环,直到用户按下一个键,但不应该要求按键继续每个循环.
有一个简单的方法吗?我想我可以做到这一点,select()但这似乎很多工作.
或者,有没有办法在程序关闭之前捕获ctrl- ckeypress进行清理而不是非阻塞io?
试着总结一下这两个概念之间的区别(因为当我看到人们在一个句子中使用它们时,我真的很困惑,比如"非阻塞异步IO",我试图找出它是什么意思).
因此,在我的理解中,非阻塞IO主要是处理IO的OS机制,如果有任何数据就绪,否则只返回错误/什么都不做.
在异步IO中,您只需提供回调,并在数据可用时通知您的应用程序.
那么实际上什么是"非阻塞异步IO"?以及它们如何用Java实现(标准JDK,没有外部库,我知道有java.nio.channels.{Channels, Selector, SelectorKey}和java.nio.channels.{AsynchronousSocketChannel}):非阻塞IO,异步IO和非阻塞异步IO(如果有这样的东西)?
如何从控制台python应用程序轮询键盘?具体来说,我想在许多其他I/O活动(套接字选择,串行端口访问等)中做类似的事情:
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
Run Code Online (Sandbox Code Playgroud)
在Windows上执行此操作的正确pythonic方法是什么?此外,Linux的可移植性也不错,但并不是必需的.