【问题标题】:Reactor pattern how it works with threads反应器模式如何与线程一起工作
【发布时间】:2018-04-16 02:35:55
【问题描述】:

我开始阅读 Vert.x 框架文档,但我不明白它是如何工作的以及什么是 Reactor 模式,我阅读了这篇文章 https://dzone.com/articles/understanding-reactor-pattern-thread-based-and-eve 并注意到不是基于一般 servlet (one request one thread) approch,Reactor 模式使用event-driven architecture,其中名为event loop 的单个线程将请求放入某种作业队列并提供一个处理程序,该处理程序将在任务完成后执行,处理程序中的代码将由此事件循环执行,所以黄金法则是 - 不要阻塞事件循环。

我不明白的是,来自文章:

Those handlers/callbacks may utilize a thread pool in multi-core environments.

所以处理程序使用线程池,这个池与标准线程池有何不同,例如Servlet's container TOMCAT。在Http server 的情况下,如果两者都使用线程池来管理请求,这两个概念有何不同。

提前致谢

【问题讨论】:

    标签: java multithreading reactor


    【解决方案1】:

    忘记那篇 DZone 文章吧。忘记反应堆模式。学习Asynchronous procedure call

    有两种方法可以将计算机中的所有工作拆分为多个部分:线程和任务(在 Java 中,任务是 Runnables)。任务准备就绪时在线程池上执行。并且当它们没有准备好时,它们不占用线程,其巨大的堆栈,我们可以承受单个 JVM 实例中的数百万个任务,而单个 JVM 实例中的 10000 个线程是有问题的。

    任务的主要问题是当任务需要尚未准备好的数据时(不是由其他任务计算的,或者尚未通过网络到达)。在线程世界中,等待数据的线程执行像inputsream.read()这样的阻塞操作,但是不允许任务这样做,否则它们会从线程池中占用太多线程,而基于任务的编程的所有优点都会迷失。因此,任务增加了一些机制,这些机制在所有参数到达时准确地将该任务提交给线程池。具有这种机制的任务称为异步过程调用。所有的事件驱动架构都是异步过程调用的变体:Vert.x、RxJava、Project Reactor、Akka Actors 等。他们只是假装是原创的,并不总是谈论这个。

    【讨论】:

    • 感谢您的回复,我可以再问一个问题吗,例如在 Vertx 中,我可以运行阻塞 jdbc 查询并为此方法提供处理程序。这是否意味着当该任务等待来自数据库的响应时,它不使用线程池中的线程?
    • 当运行在线程池上的任务执行像JDBC调用这样的阻塞操作时(据我所知,没有异步JDBC驱动程序),那么它阻塞了一个线程并且线程数减少了。或者,如果线程池是无限的,线程池会分配另一个线程,最终导致OOME。
    • 您能否澄清一下。如果我的任务取决于 jdbc 查询的结果(它是阻塞的)并且只有在它在线程池上运行之后,哪个线程被阻塞以等待 jdbc 响应?有些线程必须等待(被阻塞)才能响应,对吧?所以,我们已经阻塞了线程(不管是否在线程池中)。好处在哪里?
    • @ВадимПарафенюк 好处是等待结果的任务只有在获得结果后才会在线程池上运行。在等待期间,它不会为调用堆栈消耗核心内存。如果它是一个线程而不是一个任务,那么在等待结果时它会一直消耗内存。至于那个在 JDBC 响应上被阻塞的线程,它使用专用线程还是线程池中的一个确实没有区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 2014-09-09
    • 2021-11-14
    • 2021-10-28
    相关资源
    最近更新 更多