【发布时间】:2019-10-18 21:10:55
【问题描述】:
我想在完全相同的微时间发送两个或多个 HTTP 请求,我知道这是不可能的,可能是因为 Nodejs 是一种单线程语言并且有一个队列。
我创建了事件发射器并添加了 5 个侦听器,一旦我发射了一些东西 它发送 HTTP 请求。
const events = require('events');
const eventEmitter = new events.EventEmitter();
const callback = ()=>{
console.log(new Date().getTime());
fetch('https://jsonplaceholder.typicode.com/todos/1')
.then(response => response.json())
.then(json => console.log(json));
};
eventEmitter.on('message',callback);
// second request
eventEmitter.on('message',callback);
// third request
eventEmitter.on('message',callback);
// forth request
eventEmitter.on('message',callback);
// fifth request
eventEmitter.on('message',callback);
eventEmitter.emit('message');
这是输出
1559556527258
1559556527276
1559556527277
1559556527278
1559556527280
{ userId: 1, id: 1, title: 'delectus aut autem', completed: false }
{ userId: 1, id: 1, title: 'delectus aut autem', completed: false }
{ userId: 1, id: 1, title: 'delectus aut autem', completed: false }
{ userId: 1, id: 1, title: 'delectus aut autem', completed: false }
{ userId: 1, id: 1, title: 'delectus aut autem', completed: false }
我预计请求会在完全相同的时间运行。有没有其他方法可以同时发送这些请求?
【问题讨论】:
-
也许你能解释一下你到底想达到什么目标。无论如何,对同一主机的请求将由您的操作系统网络堆栈和 NIC 驱动程序进行序列化。
-
@MaximEgorushkin 我只是想测试“MySQL”事务是否正常工作,一些用户同时向我的应用程序发送请求,所以他们使用相同的,例如优惠券代码两次。
-
由于 TCP/IP 的工作方式,没有同时接收请求这样的事情 - 必须有一个数据包首先到达,另一个数据包随后到达。像 PHP 和 Java 这样的多线程/多处理语言往往会发生 sequential 请求意外地被并行(同时)处理,因为第二个请求在第一个请求完成之前创建了一个线程/进程。
标签: node.js asynchronous parallel-processing fetch