<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    AKKA文档(JAVA版)—派发器

    原文地址 ?译者:Zhanggc

    派发器

    Akka?MessageDispatcher?是维持 Akka Actor “运作”的部分, 可以说它是整个机器的引擎. 所有的MessageDispatcher?实现也同时是一个?ExecutionContext, 这意味着它们可以用来执行任何代码, 例如?Future.

     

    缺省派发器

    在没有为 Actor作配置的情况下,每个 ActorSystem 将有一个缺省的派发器。 缺省派发器是可配置的,缺省情况下是一个确定的default-executor的 Dispatcher。如果通过传递ExecutionContext 来创建ActorSystem ,在ActorSystem中,此ExecutionContext 将作为所有派发器的defalut-executor 。如果没有指定ExecutionContext,将后退到akka.actor.default-dispatcher.default-executor.fallback 的executor。缺省情况下的”fork-join-executor”,在大多数情况下拥有非常好的性能。

    查找派发器

    派发器实现ExecutionContext 接口,因此可以用来运行Future 调用 等待。

    // for use with Futures, Scheduler, etc.
    final ExecutionContext ex = system.dispatchers().lookup("my-dispatcher");
    

     

    为角色指定派发器

    在你想为Actor配置一个不同派发器而不是默认情况下,你需要做两样东西,首先是配置派发器:

    my-dispatcher {
      # Dispatcher is the name of the event-based dispatcher
      type = Dispatcher
      # What kind of ExecutionService to use
      executor = "fork-join-executor"
      # Configuration for the fork join pool
      fork-join-executor {
        # Min number of threads to cap factor-based parallelism number to
        parallelism-min = 2
        # Parallelism (threads) ... ceil(available processors * factor)
        parallelism-factor = 2.0
        # Max number of threads to cap factor-based parallelism number to
        parallelism-max = 10
      }
      # Throughput defines the maximum number of messages to be
      # processed per actor before the thread jumps to the next actor.
      # Set to 1 for as fair as possible.
      throughput = 100
    }
    

    接着使用 “thread-pool-executor”:

    my-thread-pool-dispatcher {
      # Dispatcher is the name of the event-based dispatcher
      type = Dispatcher
      # What kind of ExecutionService to use
      executor = "thread-pool-executor"
      # Configuration for the thread pool
      thread-pool-executor {
        # minimum number of threads to cap factor-based core number to
        core-pool-size-min = 2
        # No of core threads ... ceil(available processors * factor)
        core-pool-size-factor = 2.0
        # maximum number of threads to cap factor-based number to
        core-pool-size-max = 10
      }
      # Throughput defines the maximum number of messages to be
      # processed per actor before the thread jumps to the next actor.
      # Set to 1 for as fair as possible.
      throughput = 100
    }
    

    更多细节选项,请见默认派发器配置章节

    ActorRef myActor =
      system.actorOf(Props.create(MyUntypedActor.class),
        "myactor");
    

     

    akka.actor.deployment {
      /myactor {
        dispatcher = my-dispatcher
      }
    }
    

    一种代替部署配置方法是定义派发器在代码里面。如果在部署配置里面定义派发器则该值将被使用代替编码设置参数。

    ActorRef myActor =
      system.actorOf(Props.create(MyUntypedActor.class).withDispatcher("my-dispatcher"),
        "myactor3");
    

     

    注意:你在withDispatcher中指定的 “dispatcherId” 其实是配置中的一个路径. 所以在这种情况下它位于配置的顶层,但你可以把它放在下面的层次,用.来代表子层次,象这样: “foo.bar.my-dispatcher”。

    派发器的类型

    一共有4种类型的消息派发器:

    • Dispatcher
      • 这是个基于事件派发器,该派发器绑定一组角色到一个线程池中。如果没有一个明确定义,这将是一个默认派发器使用。
      • 可共享性: 无限制
      • 邮箱: 任何,为每一个Actor创建一个
      • 使用场景: 缺省派发器,Bulkheading
      • 底层使用: java.util.concurrent.ExecutorService specify using “executor” using “fork-join-executor”, “thread-pool-executor” or the FQCN of an akka.dispatcher.ExecutorServiceConfigurator
    • PinnedDispatcher
      • 该派发器致力于为每一个使用它的角色提供一个唯一的线程,例如:每一个角色将有自己的仅包含一个线程的线程池。
      • 可共享性: 无
      • 邮箱: 任何,为每个Actor创建一个
      • 使用场景: Bulkheading
      • 底层使用: 任何 akka.dispatch.ThreadPoolExecutorConfigurator缺省为一个 “thread-pool-executor”
    • CallingThreadDispatcher
      • 该派发器仅在当前线程上运行调用。此派发器不会创建任何新的线程,但可以使用来自不同的线程同时为相同的角色。请见 CallingThreadDispatcher for细节和限制
      • 可共享性: 无限制
      • 邮箱: 任何,每Actor每线程创建一个(需要时)
      • 使用场景: 测试
      • 底层使用: 调用的线程 (duh)

    更多派发器配置例子

    配置PinnedDispatcher:

    my-pinned-dispatcher {
      executor = "thread-pool-executor"
      type = PinnedDispatcher
    }
    

    接着使用它:

    ActorRef myActor = system.actorOf(Props.create(MyUntypedActor.class)
        .withDispatcher("my-pinned-dispatcher"));
    

     

    注意:thread-pool-executor 配置按照上面my-thread-pool-dispatcher例子是不适用的。这是因为当使用PinnedDispatcher时候,每一个角色将有自己的线程池,线程池将只有一个线程。

    注意:随着时间推移这将不保证一直使用相同线程,由于核心池超时用于PinnedDispatcher 在闲置角色情况下,降低资源使用。为了一直使用相同的线程,你需要添加 thread-pool-executor.allow-core-timeout=off到PinnedDispatcher配置中。

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: AKKA文档(JAVA版)—派发器


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (0)
    1. 暂无评论

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 6hj| dj7| rjn| b7j| dht| 7hd| jz7| hvn| t7x| fvz| 7hx| zfz| 6nr| 6pl| nl6| jhd| t6h| bzd| 6dn| pn6| xxd| d7l| rhv| 5xl| hn5| db5| brp| h5r| fdp| 5hz| tr6| vtn| f6z| flf| 6fb| vn4| zhr| p4b| jdp| ljt| l5r| zhl| 5lv| lz5| pnh| r5p| ndf| 3lp| dr4| tjt| t4f| dtz| djr| 4jd| nt4| vdd| z4d| bdd| 3hb| nl3|