- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这一直让我困惑...下面的测试显示请求是异步接收的,异步响应的,但所有请求都是首先接收的,然后响应...给定以下 3 个文件:
package.json
{
"name": "express-router-sync-test",
"version": "1.0.0",
"description": "Testing if express router has sync aspect",
"scripts": {
"start": "node server.js"
},
"dependencies": {
"body-parser": "1.16.0",
"express": "4.14.1",
"request": "2.79.0"
}
}
服务器.js
const express = require('express');
const bodyParser = require('body-parser');
const router = express.Router();
const request = require('request');
// Create our Express application
let app = express();
let port = 1111;
// body parser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(router);
// Start the server
app.listen(port);
console.log('Server listening on port ' + port + '.');
router.get('/', _get);
router.post('/test', _test);
function _test(req, res) {
console.log('starting to process request # ', req.body.requestNumber);
request({
method: 'GET',
url: 'http://localhost:1111'
}, (err, response, body) => {
console.log('process # ' + req.body.requestNumber + ' has ended');
});
}
function _get(req, res) {
res.json({ success: true });
}
测试.js
const request = require('request');
let i;
let len = 500;
let options = {
method: 'POST',
url: 'http://localhost:1111/test'
}
for (i = 0; i < len; i++) {
options.form = { requestNumber: i + 1 };
request(options, (err, response, body) => {
if (err) console.log(err);
if (response) console.log(body)
});
}
给定目录结构:
app/
--package.json
--server.js
--test.js
采取以下步骤重现测试:
npm install
node server.js
node test.js
如果您查看 server.js 终端的输出,您会注意到所有“启动进程”日志记录都分组在一起,但以异步顺序排列。您还会注意到,所有“进程结束”日志记录都分组在一起,但也以异步顺序排列。
我现在问两个问题:
任何信息将不胜感激。
编辑:这是此测试运行的示例日志,其中有 50 个请求而不是 500 个。您会注意到,在收到所有请求之前,不会响应任何请求。您发送的请求越多,等待第一个响应的时间就越长。
starting to process request # 1
starting to process request # 2
starting to process request # 3
starting to process request # 4
starting to process request # 5
starting to process request # 6
starting to process request # 9
starting to process request # 8
starting to process request # 7
starting to process request # 10
starting to process request # 12
starting to process request # 11
starting to process request # 13
starting to process request # 17
starting to process request # 16
starting to process request # 15
starting to process request # 14
starting to process request # 21
starting to process request # 19
starting to process request # 20
starting to process request # 18
starting to process request # 22
starting to process request # 23
starting to process request # 25
starting to process request # 24
starting to process request # 27
starting to process request # 28
starting to process request # 26
starting to process request # 32
starting to process request # 31
starting to process request # 30
starting to process request # 29
starting to process request # 36
starting to process request # 35
starting to process request # 33
starting to process request # 34
starting to process request # 40
starting to process request # 38
starting to process request # 39
starting to process request # 37
starting to process request # 44
starting to process request # 42
starting to process request # 43
starting to process request # 41
starting to process request # 45
starting to process request # 46
starting to process request # 47
starting to process request # 49
starting to process request # 48
starting to process request # 50
process # 1 has ended
process # 2 has ended
process # 4 has ended
process # 3 has ended
process # 5 has ended
process # 6 has ended
process # 9 has ended
process # 8 has ended
process # 11 has ended
process # 12 has ended
process # 10 has ended
process # 7 has ended
process # 13 has ended
process # 17 has ended
process # 15 has ended
process # 16 has ended
process # 14 has ended
process # 21 has ended
process # 22 has ended
process # 18 has ended
process # 20 has ended
process # 19 has ended
process # 27 has ended
process # 24 has ended
process # 25 has ended
process # 23 has ended
process # 31 has ended
process # 32 has ended
process # 26 has ended
process # 28 has ended
process # 30 has ended
process # 29 has ended
process # 34 has ended
process # 35 has ended
process # 33 has ended
process # 36 has ended
process # 40 has ended
process # 38 has ended
process # 39 has ended
process # 37 has ended
process # 44 has ended
process # 42 has ended
process # 46 has ended
process # 45 has ended
process # 41 has ended
process # 43 has ended
process # 47 has ended
process # 50 has ended
process # 48 has ended
process # 49 has ended
最佳答案
This following test shows that requests are being received asynchronously, responded to asynchronously, yet all requests are first received, then responded to...
尚不清楚这里有什么惊喜。首先接收请求然后响应?在收到请求之前对其进行响应没有多大意义。
由于这是一个非常普遍的问题,那么也许我会添加一些一般信息。首先,异步并不一定意味着无序,如果这是您的假设的话。操作可以按顺序或无序异步处理,这与所使用的并发模型无关。
现在,一般来说,每个返回值的函数(除非该值是一个 promise )都必须同步工作,只是因为它不能返回任何它没有的东西。从这个意义上说,promise 本身实际上是同步创建和返回的。异步完成的是 promise 的解决。
每个接受回调的函数通常都是异步工作的,但并非必须如此。回调可以同步调用,有时也可以同步调用,就像数组和字符串的 .map()
方法的回调一样。每个返回 Promise 的函数都应该异步工作,但也可以在返回 Promise 之前同步解析 Promise。
重点是,同步和异步与执行顺序有很大不同,它还取决于您是否使用 promise 或连续传递风格。
关于node.js - express.router()的路由是同步的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42338396/
我正在实现 IMAP 客户端,但 IMAP 邮箱同步出现问题。 首先,可以从 IMAP 服务器获取新邮件,但我不知道如何从邮箱中查找已删除的邮件。 我是否应该从服务器获取所有消息并将其与本地数据进行比
我研究线程同步。当我有这个例子时: class A { public synchronized void methodA(){ } public synchronized void met
嗨,我做了一个扩展线程的东西,它添加了一个包含 IP 的对象。然后我创建了该线程的两个实例并启动它们。他们使用相同的列表。 我现在想使用 Synchronized 来阻止并发更新问题。但它不起作用,我
我正在尝试使用 FTP 定期将小数据文件从程序上传到服务器。用户从使用 javascript XMLHttpRequest 函数读取数据的网页访问数据。这一切似乎都有效,但我正在努力解决由 FTP 和
我不知道如何同步下一个代码: javascript: (function() { var s2 = document.createElement('script'); s2.src =
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
一 点睛 1 Message 在基于 Message 的系统中,每一个 Event 也可以被称为 Message,Message 是对 Event 更高一个层级的抽象,每一个 Message 都有一个
一 点睛 1 Message 在基于 Message 的系统中,每一个 Event 也可以被称为 Message,Message 是对 Event 更高一个层级的抽象,每一个 Message 都有一个
目标:我所追求的是每次在数据库中添加某些内容时(在 $.ajax 到 Submit_to_db.php 之后),从数据库获取数据并刷新 main.php(通过 draw_polygon 更明显)。 所
我有一个重复动画,需要与其他一些 transient 动画同步。重复动画是一条在屏幕上移动 4 秒的扫描线。当它经过下面的图像时,这些图像需要“闪烁”。 闪烁的图像可以根据用户的意愿来来去去和移动。它
我有 b 个块,每个块有 t 个线程。 我可以用 __syncthreads() 同步特定块中的线程。例如 __global__ void aFunction() { for(i=0;i #
我正在使用azure表查询来检索分配给用户的所有错误实体。 此外,我更改了实体的属性以声明该实体处于处理模式。 处理完实体后,我将从表中删除该实体。 当我进行并行测试时,可能会发生查询期间,一个实体已
我想知道 SQLite 是如何实现它的。它基于文件锁定吗?当然,并不是每个访问它的用户都锁定了整个数据库;那效率极低。它是基于多个文件还是仅基于一个大文件? 如果有人能够简要概述一下 sqlite 中
我想post到php,当id EmpAgree1时,然后它的post变量EmpAgree=1;当id为EmpAgree2时,则后置变量EmpAgree=2等。但只是读取i的最后一个值,为什么?以及如何
CUBLAS 文档提到我们在读取标量结果之前需要同步: “此外,少数返回标量结果的函数,例如 amax()、amin、asum()、rotg()、rotmg()、dot() 和 nrm2(),通过引用
我知道下面的代码中缺少一些内容,我的问题是关于 RemoteImplementation 中的同步机制。我还了解到该网站和其他网站上有几个关于 RMI 和同步的问题;我在这里寻找明确的确认/矛盾。 我
我不太确定如何解决这个问题......所以我可能需要几次尝试才能正确回答这个问题。我有一个用于缓存方法结果的注释。我的代码目前是一个私有(private)分支,但我正在处理的部分从这里开始: http
我对 Java 非常失望,因为它不允许以下代码尽可能地并发移动。当没有同步时,两个线程会更频繁地切换,但是当尝试访问同步方法时,在第二个线程获得锁之前以及在第一个线程获得锁之前再次花费太长时间(比如
过去几周我一直在研究java多线程。我了解了synchronized,并理解synchronized避免了多个线程同时访问相同的属性。我编写此代码是为了在同一线程中运行两个线程。 val gate =
我有一个关于 Java 同步的简单问题。 请假设以下代码: public class Test { private String address; private int age;
我是一名优秀的程序员,十分优秀!