Warum ist die Schreibmethode im http.ServerResponse-Objekt in node.js synchron?
给我你的怀抱
给我你的怀抱 2017-05-31 10:38:35
0
3
642
var http = require('http');
http.createServer(function(req,res){
    res.writeHeader(200, {'Content-Type' : 'text/html ; charset=utf-8'})
    if(req.url !== '/favicon.ico'){
        console.time('test');
        var c=1,a=2,b=3;        
        res.write(show()+''+c);
        c=a+b;
        res.write('<br />')
        res.write(c+'<br />');
        console.timeEnd('test');
        res.end()        
    }
}).listen(8000)
function show(){
    var str='';
    for(var i=0;i<10000;i++){
        str+=i*i*i*i+'<br />';
    }
    return str
}
console.log('server is running at http://127.0.0.1:8000')

Die letzten beiden Zeilen sind 1 und 5!
Das Buch besagt, dass das http.ServerResponse-Objekt einen stream.Writable (beschreibbaren Stream) implementiert. Beschreibbare Streams sind jedoch im Allgemeinen asynchron (z. B. fs write stream, zlib stream, sub-process stdin), was perfekt für das ereignisgesteuerte Servicemodell ist. Was ich nun getestet habe, ist die res.write-Synchronisation, was bedeutet, dass dieser Rückruf ausgeführt werden muss, bevor der nächste Rückruf in der Ereigniswarteschlange ausgeführt werden kann?
function(req,res) ist der Rückruf des Ruquest-Ereignisses. Das heißt, wenn Sie Zehntausende gleichzeitiger Anfragen bearbeiten, müssen Sie Zehntausende von function(req,res) ausführen, auch wenn es keine gibt CPU-intensive Anwendungen in function(req,res) Ein wenig summiert sich das nicht, dass es zu Verzögerungen beim Benutzerzugriff kommt? Aber Node ist sehr gut im Umgang mit intensivem Io? Habe ich falsch gedacht?

Ich habe diese Show-Funktion absichtlich erstellt, da js Single-Threaded ist und nicht gut für die Verarbeitung CPU-intensiver Geschäfte geeignet ist. Daher dauert res.write(show()+''+c) länger und sieht besser aus ? Wenn res.write asynchron ist, wird c=a+b zuerst ausgeführt; dann muss c 5;

sein
给我你的怀抱
给我你的怀抱

Antworte allen(3)
伊谢尔伦

node 的优势是指,能处理高并发,是可以应付大量的请求,但是处理respone.write 或者 查询数据库的操作 是另外的线程处理的,就好像一个餐厅一样,有分厨师还有一个服务员(单线程),不像一般web服务框架只有一个厨师而且要兼职服务员,
所以你上面的情况是不是密集的io,而像是,餐厅的厨师忙不过来处理你的菜,导致服务员上菜慢。

滿天的星座

很明显,执行show()时,还没有开始执行write(),所以你这个测试方法本身就不对。

滿天的星座

write只是将数据写到内部的缓冲区就返回了,不是说把数据发送完成才返回,所以说几乎没有占用CPU时间

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!