在使用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()例子未设置的法线设置?它们有什么不同,为什么?
我是Flask的忠实粉丝- 部分原因是因为它很简单,部分原因是因为它有很多扩展.但是,Flask意味着在WSGI环境中使用,而WSGI不是非阻塞的,所以(我相信)它不像某些类型的应用程序那样扩展到Tornado.
由于每个人都有一个URL调度程序,它将调用一个函数,并且两个都将使用Python文件(在Django中你不启动python文件,但是你在烧瓶或龙卷风中)你是否有意义在你的网站上有两个独立的部分 - 一部分用Tornado运行非阻塞作业,另一部分用Flask编写?
如果这是一个好主意,您将如何在Flask和Tornado之间共享cookie /会话?我会遇到问题,因为Flask将使用它自己的系统,而Tornado将使用自己的系统吗?
这是我的问题.作为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脚本中进行繁重的计算吗?在这两种情况下,我如何将参数传递给子进程 - 例如,图像?
基本上,我已经阅读了几个socket.recv()会返回它可以读取的内容,或者一个空字符串表示另一方已关闭(官方文档甚至没有提到它在连接关闭时返回的内容...大!).这对于阻塞套接字来说都很好用,因为我们知道recv()只有当实际有东西要接收时才返回,所以当它返回一个空字符串时,它必须意味着另一方已经关闭了连接,对吧?
好的,很好,但是当我的套接字没有阻塞时会发生什么?我搜索了一下(也许还不够,谁知道?)并且无法弄清楚如何判断对方是否使用非阻塞套接字关闭了连接.似乎没有方法或属性告诉我们这一点,并且将recv()空字符串的返回值进行比较似乎绝对无用......这只是我有这个问题吗?
举一个简单的例子,假设我的套接字超时设置为1.2342342(你喜欢这里的非负数)秒和我打电话socket.recv(1024),但另一方在1.2342342秒期间没有发送任何内容.该recv()调用将返回一个空字符串,我不知道连接是否仍然存在...
曾几何时我碰到了Indy的介绍文章,从那时起就不能停止考虑阻塞与非阻塞IO.
寻找一些好文章,描述阻止IO和非阻塞IO的优缺点,以及如何在每种情况下设计应用程序,以获得自然,易于理解和易于维护的代码.
想了解大图...
有人可以解释/重定向我,Node.js的异步模型(非阻塞线程)与任何其他语言之间的区别是什么,例如c#处理I/O的异步方式.在我看来,两者都是同一型号.请建议.
非阻塞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的工作方式一样).
谢谢!
我正在实现一个简单的服务器,它接受单个连接,然后使用该套接字同时读取和写入来自读写线程的消息.在Linux上的c/c ++中同时读取和写入相同套接字描述符的安全简便方法是什么?我不需要担心从同一个套接字读取和写入多个线程,因为将有一个专用读取和单个专用写入线程写入套接字.
在上面的场景中,是否需要任何类型的锁定?
以上场景是否需要非阻塞套接字?
是否有任何开源库,这将有助于上述情况?
我想知道是否可以使用http-kit整合一个完全无阻塞的Clojure后端Web应用程序.
(实际上任何与Ring兼容的http服务器都没关系;我提到了http-kit,因为它声称有一个事件驱动的非阻塞模型).
这个问题是我对非阻塞/异步/事件驱动系统性质的一些误解的症状.如果你和我在同一个地方,这里有一些澄清.
只有当所有(例如,大多数)IO从头开始以非阻塞方式处理时,才能使事件驱动系统具有非阻塞的性能优势(如在Node.js中).这意味着所有数据库驱动程序,HTTP服务器和客户端,Web服务等都必须首先提供异步接口.特别是:
现在,具体来说:
如果我做对了(我不是专家,所以请告诉我,如果我正在做错误的假设),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) 如何在C语言的Linux/OS X上进行非阻塞控制台IO?