栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

什么时候使用线程池?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

什么时候使用线程池?

您对节点如何工作的理解是不正确的……但这是一个普遍的误解,因为这种情况的实际情况实际上相当复杂,并且通常归结为诸如“ node is single
threaded”之类的小词,过分简化了事情。

目前,我们将忽略通过集群和webworker-
threads进行的显式多处理/多线程,而仅讨论典型的非线程节点。

节点在单个事件循环中运行。它是单线程的,您只能获得一个线程。您编写的所有Javascript都会在此循环中执行,并且如果该代码中发生了阻塞操作,则它将阻塞整个循环,直到完成为止,其他任何事情都不会发生。这是您经常听到的节点的典型单线程性质。但是,这还不是全部。

通常使用C / C ++编写的某些功能和模块支持异步I /
O。当您调用这些函数和方法时,它们在内部管理将调用传递给工作线程。例如,当您使用

fs
模块请求文件时,
fs
模块将该调用传递给工作线程,而该工作线程等待其响应,然后将其呈现回事件循环,该循环在没有它的情况下一直在进行与此同时。所有这些都是从您(节点开发人员)那里抽象出来的,其中一些是通过使用libuv从模块开发者那里抽象出来的。

正如Denis
Dollfus在评论中指出的(,libuv用于实现异步I /
O的策略并不总是线程池,特别是在

http
模块的情况下,另一种策略似乎是目前使用。就我们的目的而言,最重要的是要注意如何实现异步上下文(通过使用libuv),并且libuv维护的线程池是该库提供的实现异步的多种策略之一。


在一篇非常相关的切线上,这篇出色的文章对节点如何实现异步性以及一些相关的潜在问题以及如何处理这些问题进行了更深入的分析。它的大部分内容是在我上面写的内容基础上扩展的,但另外指出:

  • 您包含在项目中的任何使用本机C ++和libuv的外部模块都可能使用线程池(请考虑:数据库访问)
  • libuv的默认线程池大小为4,并使用队列来管理对线程池的访问-结果是,如果您有5个长时间运行的数据库查询全部同时进行,则其中之一(以及任何其他异步查询)依赖于线程池的操作)将等待查询结束,甚至无法开始
  • 您可以通过
    UV_THREADPOOL_SIZE
    环境变量增加线程池的大小来缓解这种情况,只要您在需要并创建线程池之前就这样做即可:
    process.env.UV_THREADPOOL_SIZE = 10;

如果您希望在节点中进行传统的多处理或多线程处理,则可以通过内置

cluster
模块或上述其他各种模块来获取
webworker-threads
,也可以通过实现某种方式将工作分块并手动使用
setTimeout
或进行伪造。
setImmediate
process.nextTick
暂停您的工作并在以后的循环中继续进行,以完成其他过程(但不建议这样做)。

请注意,如果您使用javascript编写长时间运行/阻止的代码,则可能是在犯错误。其他语言将更有效地执行。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/373242.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号