Context

背景

  • 在vertx框架中,核心概念是verticle,通过vertx可以部署多个verticle,且verticle之间可以互相通信。
  • 对于部署1个verticle,会有1个context与该verticle绑定,而且该verticle中执行的操作是交给context去执行的,所以说context为verticle提供了操作接口,context会绑定1个eventloop。
  • context包含如下核心成员:
    • EventLoop eventLoop:该verticle分配到的eventloop。
    • VertxThread contextThread:当前执行线程。
    • WorkerPool workerPool:worker线程池,包含的执行器是FixedThreadPool,对于多个context,即多个verticle之间是共享worker线程池的。
    • Executor workerExec:workerPool的顺序执行器,每个verticle会有一个workerPool创建的顺序执行器,用于需要保证提交的回调任务顺序执行。
    • WorkerPool internalBlockingPool:内部线程池,包含的执行器是FixedThreadPool,对于多个context,即多个verticle之间是共享内部线程池的。内部线程池很少会用到,只有提交Action回调时才会用内部线程池执行,而Handler回调会使用worker线程池执行。
    • Executor orderedInternalPoolExec:internalBlockingPool的顺序执行器。

context分类

Context_第1张图片
context.png
  • 在vertx中,有3种context,对应verticle的3种模式。

    • EventLoopContext是standard模式verticle的context;
    • WorkerContext是worker模式verticle的context;
    • MultiThreadedWorkerContext是MultiThreadedWorker模式verticle的context。
  • context用于标识verticle运行的线程。

    • ContextImpl:对于executeBlocking方法,如果传入的回调是Action类型,那么会在内部线程池执行;如果传入的回调是Handler类型,那么会在worker线程池中执行,且如果ordered为true那么会在WorkerPool的顺序执行器中执行。对于executeFromIO方法,会在调用线程执行。
    • EventLoopContext:verticle的运行线程为vertx的eventloop线程,但调用executeAsync方法会在eventloop线程中执行。
    • WorkerContext:verticle的运行线程为vertx的worker线程,但调用executeAsync或executeFromIO方法会在WorkerPool的顺序执行器中执行。
    • MultiThreadedWorkerContext:verticle的运行线程为vertx的worker线程,但调用executeAsync方法会在worker线程池中执行。

EventLoopContext

  • 对于standard模式的verticle,每个verticle会绑定1个eventloop线程,因此该verticle的一般操作都在绑定的eventloop线程中执行,除非调用executeBlocking方法会在worker线程池中执行,如果需要通过executeBlocking提交的多个回调任务按顺序执行,需要指定ordered参数为true。

WorkerContext

  • 对于worker模式的verticle,每个verticle每次在执行1个handler时会选择1个worker线程执行,如果在执行1个handler中调用了executeBlocking或executeAsync方法,那么传入的回调可能会在别的worker线程中执行了。

MultiThreadedWorkerContext

  • 对于多线程模式的verticle,httpserver不能在多线程模式的verticle中运行,而且这个模式用的比较少,暂时不详细介绍。

你可能感兴趣的:(Context)