[英]java fork-join executor usage for db access
ForkJoinTask显式调出“可细分的任务也不应执行阻塞的I / O ”。 它的主要目标是“ 计算任务以计算纯函数或对纯隔离对象进行操作”。 我的问题是:
在我的场景中,单个请求执行两种类型的工作,其中一种是加密,它将200毫秒内的CPU内核推到100%,第二次是很少的数据库调用。 诸如6个用于加密的线程和2个用于阻止IO的线程之类的静态分区都无法提供CPU的最佳使用。 因此,拥有一个fork-join执行器,并且在一定数量的总CPU数量上过度配置了一定数量的线程,再加上工作偷窃,将确保更好地利用CPU资源。
我对forkjoin执行器的上述假设和理解是否正确,如果不正确,请指出空白。
为什么要设计ForkJoinTask来限制阻塞的IO任务?
分叉联接池的底层是共享的线程数量,如果这些线程上有一些IO工作受阻,则用于CPU密集型工作的线程会更少。 其他没有人阻止工作。
如果我确实执行阻塞IO任务,该怎么办?
通常,FJPool为线程分配有关处理器数量的信息。 因此,如果必须在线程上使用IO
阻塞,请确保为其他任务分配足够的线程。
您还可以在与FJ池不共享的专用线程上隔离IO工作。 但您调用blocking
IO,则线程被阻止并安排执行其他任务,直到取消阻止
spring和play框架为何都包含使用fork-join执行程序进行数据库调用的示例?
play
也没什么不同。 他们将专用pools
用于IO任务,因此其他任务不会受到影响。
框架不限制任何类型的处理。 不建议进行阻塞等。几年前,我对这个框架进行了评论,这是建议的重点。 该版本适用于Java7版本,但仍适用于Java8。
阻塞不是致命的,冲刺和游戏阻塞,它们工作得很好。 使用Java8时需要小心,因为有一个默认的公共叉/连接池,并且绑定线程可能会对其他用户造成影响。 您总是可以使用额外的开销定义自己的f / j池,但是至少您不会使用公共池来干扰其他人。
您的情况看起来还不错。 您不必等待来自互联网的回复。 试试看。 如果遇到使线程停止的困难,请查看ForkJoinPool.ManagedBlocker接口。 使用该接口会通知f / j池您正在执行阻塞调用,框架将创建补偿线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.