标签: nonblocking

为什么只读打开命名管道块?

在使用Python在各种UNIX(Linux,FreeBSD和MacOS X)下处理命名管道(FIFO)时,我注意到了一些奇怪的事情.第一个,也许是最烦人的是尝试打开空闲/空闲FIFO只读将被阻止(除非我使用os.O_NONBLOCK较低级别的os.open()调用).但是,如果我打开它进行读/写,那么我就不会阻塞.

例子:

f = open('./myfifo', 'r')               # Blocks unless data is already in the pipe
f = os.open('./myfifo', os.O_RDONLY)    # ditto

# Contrast to:
f = open('./myfifo', 'w+')                           # does NOT block
f = os.open('./myfifo', os.O_RDWR)                   # ditto
f = os.open('./myfifo', os.O_RDONLY|os.O_NONBLOCK)   # ditto
Run Code Online (Sandbox Code Playgroud)

我只是好奇为什么.为什么打开调用块而不是后续的一些读操作?

另外我注意到非阻塞文件描述符可以表现为Python中的不同行为.在我使用的情况下os.open()os.O_NONBLOCK初始开启操作那么os.read()似乎如果数据还没有准备好文件描述符返回一个空字符串.但是,如果我使用fcntl.fcnt(f.fileno(), fcntl.F_SETFL, fcntl.GETFL | os.O_NONBLOCK)然后os.read引发异常(errno.EWOULDBLOCK)

是否有一些其他标志open()由我的os.open()例子未设置的法线设置?它们有什么不同,为什么?

file-io posix nonblocking named-pipes fifo

57
推荐指数
1
解决办法
2万
查看次数

一起使用Flask和Tornado?

我是Flask的忠实粉丝- 部分原因是因为它很简单,部分原因是因为它有很多扩展.但是,Flask意味着在WSGI环境中使用,而WSGI不是非阻塞的,所以(我相信)它不像某些类型的应用程序那样扩展到Tornado.

由于每个人都有一个URL调度程序,它将调用一个函数,并且两个都将使用Python文件(在Django中你不启动python文件,但是你在烧瓶或龙卷风中)你是否有意义在你的网站上有两个独立的部分 - 一部分用Tornado运行非阻塞作业,另一部分用Flask编写?

如果这是一个好主意,您将如何在Flask和Tornado之间共享cookie /会话?我会遇到问题,因为Flask将使用它自己的系统,而Tornado将使用自己的系统吗?

python wsgi tornado nonblocking flask

54
推荐指数
1
解决办法
4万
查看次数

如何将node.js模块作为node.js程序的子进程执行?

这是我的问题.作为node.js模块,我实现了一个执行大量计算的小脚本.因此,如果我输入"node myModule.js",它会计算一秒钟,然后返回一个值.现在,我想从我的主Node.JS程序中使用该模块.我可以将所有计算放在"doSomeCalculation"函数中然后执行:

var myModule = require("./myModule");
myModule.doSomeCalculation();
Run Code Online (Sandbox Code Playgroud)

但这会阻塞,因此它会很糟糕.我想以非阻塞的方式使用它,例如本地的数据库调用.所以我尝试使用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!"); });
Run Code Online (Sandbox Code Playgroud)

但是,当然,它不起作用.我试图在myModule中使用EventEmitter,发出"calculateDone"事件并尝试在上面的示例中的"ext"变量上添加关联的侦听器.仍然无法正常工作.

至于分叉,它们并不是我想要做的.Forks需要将与计算相关的代码放在主程序中,在父进行任何操作的同时在子进行分叉,计算,然后如何返回结果?

所以这是我的问题:当计算放在Node文件中时,我可以使用子进程进行非阻塞计算,还是只是不可能?我应该在Python脚本中进行繁重的计算吗?在这两种情况下,我如何将参数传递给子进程 - 例如,图像?

nonblocking node.js

51
推荐指数
1
解决办法
4万
查看次数

如果在超时之前没有收到数据,Python的socket.recv()会返回非阻塞套接字是什么?

基本上,我已经阅读了几个socket.recv()会返回它可以读取的内容,或者一个空字符串表示另一方已关闭(官方文档甚至没有提到它在连接关闭时返回的内容...大!).这对于阻塞套接字来说都很好用,因为我们知道recv()只有当实际有东西要接收时才返回,所以当它返回一个空字符串时,它必须意味着另一方已经关闭了连接,对吧?

好的,很好,但是当我的套接字没有阻塞时会发生什么?我搜索了一下(也许还不够,谁知道?)并且无法弄清楚如何判断对方是否使用非阻塞套接字关闭了连接.似乎没有方法或属性告诉我们这一点,并且将recv()空字符串的返回值进行比较似乎绝对无用......这只是我有这个问题吗?

举一个简单的例子,假设我的套接字超时设置为1.2342342(你喜欢这里的非负数)秒和我打电话socket.recv(1024),但另一方在1.2342342秒期间没有发送任何内容.该recv()调用将返回一个空字符串,我不知道连接是否仍然存在...

python sockets nonblocking recv

50
推荐指数
3
解决办法
12万
查看次数

阻止IO与非阻塞IO; 寻找好文章

曾几何时我碰到了Indy的介绍文章,从那时起就不能停止考虑阻塞与非阻塞IO.

寻找一些好文章,描述阻止IO和非阻塞IO的优缺点,以及如何在每种情况下设计应用程序,以获得自然,易于理解和易于维护的代码.
想了解大图...

io events nonblocking blocking

47
推荐指数
2
解决办法
4万
查看次数

Node.js与.net中的Async/await

有人可以解释/重定向我,Node.js的异步模型(非阻塞线程)与任何其他语言之间的区别是什么,例如c#处理I/O的异步方式.在我看来,两者都是同一型号.请建议.

asynchronous nonblocking node.js async-await

47
推荐指数
3
解决办法
1万
查看次数

每个连接模型的Java线程与NIO

非阻塞Java NIO是否仍然比每个连接异步套接字的标准线程慢?

另外,如果你每个连接使用线程,你会创建新线程还是使用非常大的线程池?

我正在用Java编写一个MMORPG服务器,它应该能够在足够强大的硬件下轻松扩展10000个客户端,尽管最大客户端数量是24000(我相信由于15000线程,每个连接模型的线程无法达到Java中的限制).从一篇三年前的文章中,我听说用每个连接模式的线程阻塞IO仍然比NIO快25%(即本文档http://www.mailinator.com/tymaPaulMultithreaded.pdf),但是可以在这一天还能实现吗?从那以后Java发生了很大变化,我听说在比较现实生活场景时结果是有问题的,因为使用的VM不是Sun Java.另外,因为它是一个MMORPG服务器,许多并发用户互相交互,所以使用同步和线程安全实践会降低性能,以至于为10000个客户端提供服务的单线程NIO选择器会更快吗?(所有工作都不必在带有选择器的线程上处理,它可以在工作线程上处理,就像MINA/Netty的工作方式一样).

谢谢!

java multithreading asynchronous nio nonblocking

37
推荐指数
3
解决办法
2万
查看次数

在C或C++中同时读取和写入同一个套接字

我正在实现一个简单的服务器,它接受单个连接,然后使用该套接字同时读取和写入来自读写线程的消息.在Linux上的c/c ++中同时读取和写入相同套接字描述符的安全简便方法是什么?我不需要担心从同一个套接字读取和写入多个线程,因为将有一个专用读取和单个专用写入线程写入套接字.

在上面的场景中,是否需要任何类型的锁定?

以上场景是否需要非阻塞套接字?

是否有任何开源库,这将有助于上述情况?

c c++ sockets linux nonblocking

36
推荐指数
3
解决办法
3万
查看次数

我可以使用http-kit和core.async创建一个完全无阻塞的后端应用程序吗?

我想知道是否可以使用http-kit整合一个完全无阻塞的Clojure后端Web应用程序.

(实际上任何与Ring兼容的http服务器都没关系;我提到了http-kit,因为它声称有一个事件驱动的非阻塞模型).


编辑:TL; DR

这个问题是我对非阻塞/异步/事件驱动系统性质的一些误解的症状.如果你和我在同一个地方,这里有一些澄清.

只有当所有(例如,大多数)IO从头开始以非阻塞方式处理时,才能使事件驱动系统具有非阻塞的性能优势(如在Node.js中).这意味着所有数据库驱动程序,HTTP服务器和客户端,Web服务等都必须首先提供异步接口.特别是:

  • 如果您的数据库驱动程序提供同步接口,则无法使其成为非阻塞.(您的线程被阻止,无法检索它).如果你想要非阻塞,你需要使用其他东西.
  • 像core.async这样的高级协调实用程序无法使系统无阻塞.它们可以帮助您管理非阻塞代码,但不启用它.
  • 如果您的IO驱动程序是同步的,您可以使用core.async来获得异步的设计优势,但是您将无法获得它的性能优势.您的线程仍将浪费时间等待每个响应.

现在,具体来说:

  • 作为HTTP服务器的http-kit提供了非阻塞的异步接口.见下文.
  • 但是,许多Ring中间件由于它们基本上是同步的,因此与这种方法不兼容.基本上,任何更新返回响应的Ring中间件都不可用.

如果我做对了(我不是专家,所以请告诉我,如果我正在做错误的假设),Web应用程序的这种非阻塞模型的原则如下:

  1. 有一些超快的OS线程处理所有CPU密集型计算; 这些绝对不能等待.
  2. 有很多"弱线程"处理IO(数据库调用,Web服务调用,休眠等); 这些主要是为了等待.
  3. 这是有益的,因为在处理请求上花费的等待时间通常是2(磁盘访问)到5(Web服务调用)数量级高于计算时间.

从我所看到的,默认情况下,Play Framework(Scala)和Node.js(JavaScript)平台支持此模型,具有基于承诺的实用程序,用于以编程方式管理异步.

让我们尝试使用Compojure路由在基于Ring的clojure应用程序中执行此操作.我有一个通过调用my-handle函数构造响应的路由:

(defroutes my-routes
  (GET "/my/url" req (my-handle req))
  )
(def my-app (noir.util.middleware/app-handler [my-routes]))
(defn start-my-server! [] 
  (http-kit/run-server my-app))
Run Code Online (Sandbox Code Playgroud)

在Clojure应用程序中管理异步的普遍接受的方式似乎是基于CSP,使用core.async库,我完全没问题.因此,如果我想接受上面列出的非阻塞原则,我将以my-handle这种方式实现:

(require '[clojure.core.async :as a])

(defn my-handle [req]
  (a/<!!
    (a/go ; `go` makes channels calls asynchronous, so I'm not …
Run Code Online (Sandbox Code Playgroud)

clojure nonblocking ring core.async http-kit

35
推荐指数
1
解决办法
4832
查看次数

32
推荐指数
4
解决办法
6万
查看次数