(100分)node.js难道不能模拟一个事件堵塞,另一个事件非堵塞吗?

bsnry 2017-09-24 10:04:33
var exec = require("child_process").exec;

function start(response) {
console.log("Request handler 'start' was called.");


exec("ls",
{ timeout: 100000, maxBuffer: 20000 * 1024 },
function (error, stdout, stderr) {

// function sleep(milliSeconds) {
// var startTime = new Date().getTime();
// while (new Date().getTime() < startTime + milliSeconds);
// }

// sleep(10000);
response.writeHead(200, { "Content-Type": "text/plain" });
response.write(stdout);
response.end();
});
}

function upload(response) {
console.log("Request handler 'upload' was called.");
response.writeHead(200, { "Content-Type": "text/plain" });
response.write("Hello Upload");
response.end();
}

exports.start = start;
exports.upload = upload;



// function sleep(milliSeconds) {
// var startTime = new Date().getTime();
// while (new Date().getTime() < startTime + milliSeconds);
// }

// sleep(10000);

这块代码取消注释后,结果upload函数也被堵塞了?

我的本意是——————模拟start被堵塞几十秒钟,不堵塞upload,结果 start和upload都被堵塞了。


这个js 文件是被router.js调用的。

curl -v http://127.0.0.1:8888/start

curl -v http://127.0.0.1:8888/upload
...全文
273 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
似梦飞花 2017-10-09
  • 打赏
  • 举报
回复
generator 什么时候想往下执行就next next一次后会阻塞在下一个yied中 但又不影响其他代码执行 试试
bsnry 2017-10-09
  • 打赏
  • 举报
回复
引用 7 楼 LeonBec 的回复:
你说的这是异步吧,除非没有其他可运行的code,他就会堵塞,如settimeout
按照这说法, 终于明白的意思了, js的不能够通过代码来模拟“一个事件堵塞, 另一个事件不堵塞”。 只能通过js提供的异步调用,具体的堵塞时间,需要看“操作”(数据库、io,网络)。 这是对的? 是说js程序员,只能使用js自身提供的来堵塞某个事件,不能够自己来堵塞某个事件,不然会堵塞所有。 也就是说,js程序员的“权利”很小,是这个意思不?
x80819091 2017-10-01
  • 打赏
  • 举报
回复
你说的这是异步吧,除非没有其他可运行的code,他就会堵塞,如settimeout
bsnry 2017-09-29
  • 打赏
  • 举报
回复
引用 4 楼 functionsub 的回复:
这只是模拟,具体阻塞时间那取决于你的代码执行时间(比如数据库同步查询、文件同步读写)。
终于明白的意思了, js的不能够通过代码来模拟“一个事件堵塞, 另一个事件不堵塞”。 只能通过js提供的异步调用,具体的堵塞时间,需要看“操作”(数据库、io,网络)。
75闪光雷 2017-09-26
  • 打赏
  • 举报
回复
http://blog.csdn.net/qq_34309305/article/details/71552543
bsnry 2017-09-25
  • 打赏
  • 举报
回复
引用 2 楼 functionsub 的回复:
JS是单线程的。 所以一阻塞就都阻塞了。
var queue = [];
for(let i=0;i<10;i++){
    queue.push(function(){
        console.log(i);
    })
};
var time = new Date().getTime();
var a = function(){
    var _time = new Date().getTime();
    if(_time - time >= 5000){
        return false;
    }
    return true;
};
while(a()){// 阻塞
    var fn;
    while(queue.length){ // 执行队列
        fn = queue.shift();
        fn();
    }
};
while(queue.length){ // 执行阻塞解除后的执行队列
    fn = queue.shift();
    fn();
}
console.log('end');
不知道这样是不是你想要的效果?
你的意思就是说: function start(response) { console.log("Request handler 'start' was called."); exec("ls", { timeout: 100000, maxBuffer: 20000 * 1024 }, function (error, stdout, stderr) { // function sleep(milliSeconds) { // var startTime = new Date().getTime(); // while (new Date().getTime() < startTime + milliSeconds); // } // sleep(10000); response.writeHead(200, { "Content-Type": "text/plain" }); response.write(stdout); response.end(); }); } 如果我不对那块代码取消掉注释,那么start的堵塞时间,只能 依赖于ls的时间了
functionsub 2017-09-25
  • 打赏
  • 举报
回复
这只是模拟,具体阻塞时间那取决于你的代码执行时间(比如数据库同步查询、文件同步读写)。
functionsub 2017-09-25
  • 打赏
  • 举报
回复
JS是单线程的。 所以一阻塞就都阻塞了。
var queue = [];
for(let i=0;i<10;i++){
    queue.push(function(){
        console.log(i);
    })
};
var time = new Date().getTime();
var a = function(){
    var _time = new Date().getTime();
    if(_time - time >= 5000){
        return false;
    }
    return true;
};
while(a()){// 阻塞
    var fn;
    while(queue.length){ // 执行队列
        fn = queue.shift();
        fn();
    }
};
while(queue.length){ // 执行阻塞解除后的执行队列
    fn = queue.shift();
    fn();
}
console.log('end');
不知道这样是不是你想要的效果?
bsnry 2017-09-25
  • 打赏
  • 举报
回复
up起来,帮忙看看

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧