从我一直在阅读上由The Open Group网站上fcntl,open,read,和write,我得到的印象是,是否O_NONBLOCK被设置在一个文件描述符,因此非阻塞I/O是否使用与描述符,应该是一个属性该文件描述符而不是底层文件.作为文件描述符的属性意味着,例如,如果我复制文件描述符或打开另一个描述符到同一个文件,那么我可以使用阻塞I/O和一个非阻塞I/O与另一个.
然而,尝试使用FIFO,似乎不可能同时为FIFO提供阻塞I/O描述符和非阻塞I/O描述符(因此O_NONBLOCK设置是否是基础文件的属性[FIFO] ):
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int fds[2];
if (pipe(fds) == -1) {
fprintf(stderr, "`pipe` failed.\n");
return EXIT_FAILURE;
}
int fd0_dup = dup(fds[0]);
if (fd0_dup <= STDERR_FILENO) {
fprintf(stderr, "Failed to duplicate the read end\n");
return EXIT_FAILURE;
}
if (fds[0] == fd0_dup) {
fprintf(stderr, "`fds[0]` should not equal `fd0_dup`.\n");
return EXIT_FAILURE;
}
if …Run Code Online (Sandbox Code Playgroud) 我在nginx中看到这样的代码:
if(fcntl(ngx_processes[s].channel[0], F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK) == -1) {
...
if (ioctl(ngx_processes[s].channel[0], FIOASYNC, &on) == -1) {
...
Run Code Online (Sandbox Code Playgroud)
谁能告诉我什么是之间的区别fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK)和ioctl(s, FIOASYNC, &on),不async和nonblocking一样的东西?
我创建了一个FIFO,并定期从a.py以只读和非阻塞模式打开它:
os.mkfifo(cs_cmd_fifo_file, 0777)
io = os.open(fifo, os.O_RDONLY | os.O_NONBLOCK)
buffer = os.read(io, BUFFER_SIZE)
Run Code Online (Sandbox Code Playgroud)
从b.py,打开fifo进行写作:
out = open(fifo, 'w')
out.write('sth')
Run Code Online (Sandbox Code Playgroud)
然后a.py将引发错误:
buffer = os.read(io, BUFFER_SIZE)
OSError: [Errno 11] Resource temporarily unavailable
Run Code Online (Sandbox Code Playgroud)
谁知道什么是错的?
我正在寻找一种XML解析器,而不是从InputStream或InputSource解析,而是允许将文本块推送到解析器中.例如,我希望得到以下内容:
public class DataReceiver {
private SAXParser parser = //...
private DefaultHandler handler = //...
/**
* Called each time some data is received.
*/
public void onDataReceived(byte[] data) {
parser.push(data, handler);
}
}
Run Code Online (Sandbox Code Playgroud)
原因是我想要一些能够与NIO网络库一起使用的东西,而不是必须恢复到支持阻塞InputStream所需的每个连接模型的线程.
我已经读过等待使得所有线程独立完成并且无锁可确保程序整体完成.我不太明白.任何人都可以举一个例子(java)来说明这一点.
编辑:无锁意味着没有死锁的程序?
我读到的关于使用node.js的最常见主题是由于它是偶数的非阻塞I/O模型而具有高可伸缩性.我试图了解其他非可伸缩性用例(除了用作一般的服务器端javascript引擎).
javascript nonblocking serverside-javascript evented-io node.js
有没有办法可以使用python的socket.accept()以非阻塞的方式运行它,让我只检查它是否有任何新的连接?我真的不想使用线程.谢谢.
我试图在nodejs中创建一个非阻塞的重计算.拿这个例子(从其他东西中删除):
http.createServer(function(req, res) {
console.log(req.url);
sleep(10000);
res.end('Hello World');
}).listen(8080, function() { console.log("ready"); });
Run Code Online (Sandbox Code Playgroud)
可以想象,如果我同时打开2个浏览器窗口,第一个将等待10秒,另一个将等待20,如预期的那样.因此,在知道回调以某种方式异步的情况下,我取消了睡眠并将其放入:
doHeavyStuff(function() {
res.end('Hello World');
});
Run Code Online (Sandbox Code Playgroud)
功能简单定义:
function doHeavyStuff(callback) {
sleep(10000);
callback();
}
Run Code Online (Sandbox Code Playgroud)
那当然不起作用......我也尝试定义一个EventEmitter并注册它,但是Emitter的主要功能在发出'done'之前就已经进入了睡眠状态,所以一切都会运行阻塞.
我想知道其他人如何编写非阻塞代码...例如mongojs模块,或者child_process.exec是非阻塞的,这意味着在代码的某处,他们将进程分配到另一个线程并听取它的事件.我怎样才能在一个例如漫长过程的方法中复制它?
我是否完全误解了nodejs范式?:/
谢谢!
感谢Linus的答案,确实唯一的方法是生成子进程,例如另一个节点脚本:
http.createServer(function(req, res) {
console.log(req.url);
var child = exec('node calculate.js', function (err, strout, strerr) {
console.log("fatto");
res.end(strout);
});
}).listen(8080, function() { console.log("ready"); });
Run Code Online (Sandbox Code Playgroud)
calculate.js可以花时间去做它需要的东西并返回.通过这种方式,可以并行运行多个请求.
我知道node.js是一个单线程,异步,非阻塞的i/o.我已经阅读了很多相关内容.例如,PHP每个请求使用一个线程,但节点只使用一个线程,就像那样.
假设在node.js服务器上有三个请求a,b,c同时到达.其中三个请求需要大量阻塞操作,例如,他们都想读取相同的大文件.
那么请求如何排队,执行阻塞操作的顺序以及调度响应的顺序是什么?当然使用了多少线程?
请告诉我三个请求的请求到响应的顺序.
nonblocking ×10
node.js ×3
python ×3
c ×2
java ×2
algorithm ×1
asynchronous ×1
asyncsocket ×1
eof ×1
evented-io ×1
fcntl ×1
fifo ×1
file ×1
javascript ×1
posix-api ×1
sockets ×1
tcp ×1
xml ×1