我在玩HttpServer;并增加了对提供静态文件的支持(我知道Shelf;这是一项学习练习)。我有一个处理程序列表,这些处理程序可以按顺序处理该请求(在处理该请求的第一个处停止):
const handlers = const [
handleStaticRequest
];
handleRequest(HttpRequest request) {
// Run through all handlers; and if none handle the request, 404
if (!handlers.any((h) => h(request))) {
request.response.statusCode = HttpStatus.NOT_FOUND;
request.response.headers.contentType = new ContentType("text", "html");
request.response.write('<h1>404 File Not Found</h1>');
request.response.close();
}
}
但是,当我实现静态文件处理程序时,除非我使用file.existsSync(),否则我意识到我无法直接返回true / false(上面的handleRequest代码要求此信号,以指示是否处理了请求)。
在诸如ASP.NET之类的东西中,我不会再三考虑请求中的阻塞调用,因为它是线程化的。但是在Dart中,如果这样的IO命中期间每个请求都阻塞其他每个请求,则似乎是一个瓶颈。
因此,我决定看一下Shelf,看看它是如何处理的;但令人失望的是,它似乎执行了相同的操作(实际上,它执行了多个同步文件系统命中)。
我是否高估了这种影响?还是对Dart网络服务来说不是一个好主意?我不是在写脸书;但是我仍然想学习以最有效的方式写东西。
如果认为不好;是否有内置的方式“按顺序执行这些期货,直到第一个期货返回此条件的匹配项”?我可以看到Future.forEach,但是它没有保释的能力。我猜想“ Future.any”可能就是如果它存在的话(但事实并非如此)?
您的帖子中有很多很好的问题(也许我们应该将它们分解为单独的SO问题?)。
为了回答帖子标题的问题,服务器的最佳实践是使用异步方法。
对于命令行实用程序和简单脚本,sync方法非常好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句