我知道Web服务器使用线程池来节省昂贵的线程创建操作。我的问题是,线程池是否共享在同一个Web服务器上部署的不同模块?
特别是,我们部署了两个Web模块。仅在一个模块中定义的过滤器设置threadlocal变量(并且永远不会取消它)。那个threadlocal是否也会在另一个web模块中可见,因为同一个线程在那里被重用了?
感谢
答案 0 :(得分:1)
我不确定所有服务器,但在Tomcat的情况下,为给定端口设置了线程池。因此,如果您的模块部署在不同的端口下,那么每个模块都将具有单独的线程池。因此,threadLocal仅对给定模块可见。
来自Tomcat配置的示例摘录。我猜其他服务器使用类似的方法。
答案 1 :(得分:1)
这在很大程度上取决于Web服务器技术。
例如,Node.js在它自己的单独进程中运行每个模块。每个进程都有一个运行服务器模块的JavaScript代码的线程,以及一个线程池中的其他节点运行时 libuv 线程,在同一个工作中进行异步工作。由于每个模块都在自己的进程中运行,因此它将拥有自己的线程池,而不与其他模块共享。不同的进程不能共享同一个线程池。
故事的道德是,如果不同的Web模块以某种方式在同一个进程内运行,那么它们理论上可以共享一个相同的线程池,但是如果Web服务器在它自己的进程中运行每个已部署的Web模块,那么它是不可能他们共享一个相同的线程池。