nodejs单线程?如果有大量并发请求,它如何工作

阿迪戈

我是nodejs的新手,目前正在学习它。我知道nodejs是单线程的,但是我想知道:例如,如果我使用非阻塞方法,则有20000个并发请求,而一个请求需要花费很长时间,而其他线程则需要更短的时间。因此,一旦我们满足了更长的时间要求,nodejs就会说“嗨,请暂停,需要使用其他请求”,nodejs是否有默认时间来检测是否需要暂停?请更正我,如果我使用了错误的单词“ puase”(因为我认为这是单线程的,所以如果要处理另一个请求,它应该停止为一个请求计算)。在我假设的情况下,那么较长的请求需要很多时间才能处理?

感谢您的帮助。

凯文·B

确实,node.js一次只能接收或响应一个请求,但是它可以同时处理多个请求。

例如,假设您有一个作为rest api的node.js应用程序,并且每个请求都导致对数据库的调用,端点C除外。其余api具有3个端点。

端点A:需要3秒钟才能与数据库对话

端点B:花费2秒与数据库对话

端点C:不与数据库对话,它仅返回静态文本。

一次最多只能发生1个请求。无论时间戳有多近,总是第一。

现在,假设我们同时有10个请求按此顺序发生:

ABCBCCAABC

以下是如何接收和回复它们的方法:

REC:A
REC:B
REC:C
RESP:C
REC:B
REC:C
RESP:C
REC:C
RESP:C
REC:A
REC:A
REC:B
REC:C
RESP:C
// 2 seconds later
RESP:B
RESP:B
RESP:B
// 1 second later
RESP:A
RESP:A
RESP:A

C总是立即发生,因为它不执行任何异步操作。然后,您收到所有B,然后收到所有A,因为B比A快。

尽管B和A的顺序可能会因数据库设置而异,例如,如果将其设置为一次仅处理x个查询,则该顺序可能会有所不同。

如果我们引入了端点D并执行了耗时6秒的同步操作,您将得到以下结果:

ADABC

REQ:A
REQ:D
// 6 long seconds later...
RESP:D
REQ:A
REQ:B
REQ:C
RESP:C
// 2 seconds later...
RESP:B
// 1 second later...
RESP:A
RESP:A

因为D在执行同步操作时会停止所有JavaScript处理。1个执行同步操作的端点很容易导致有人将您的api暂停。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

汇总扫描-如果有大量线程,则结果错误

Redis是单线程的,那么它如何执行并发I / O?

如果有许多客户端连接,Netty线程模型如何工作?

node.js单线程模型如何处理并发请求?

如果有任何请求在tomcat线程池中创建更多线程怎么办

Node.js单线程与并发

单线程Node.js如何同时处理请求?

Javascript是如何单线程的?

如果有错误的请求,RestTemplate无法正常工作

如果有新请求传入,如何取消发送请求?

Haskell中的并发性:如果单线程但设置了+ RTS -N怎么办

如果有人在java中失败,如何停止所有线程?

具有大量内存访问功能的多线程比单线程慢

如果有一个线程,异步任务如何说它们“完成”了?

NodeJS性能问题-单线程

如果有人卸载并清除所有数据,onUpgrade() 如何工作?

如果Redis是单线程的,它怎么会这么快?

如何设置条件,如果有数据,它将呈现该数据,但如果没有,它只会呈现 null

单线程工作和多线程不工作

clojure reduce函数使用所有内核,即使它似乎是单线程的

如何使用固定数量的工作线程实现简单线程

如何配置单线程ForkJoinPool?

如何正确管理单线程执行?

javascript如何单线程和异步

单线程通过单线

如果有不同数量的命令行参数怎么办?我如何在 C 中处理它?

有什么方法可以使dispatch_queue_t在单线程中工作?

如果有重复,如何总结记录?

如何申请如果有以下结果的条件?