- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
更新:我发现如果我将ThreadPoolExecutor's
核心池大小设置为与最大池大小相同(29个线程),则程序将保持响应状态。但是,如果我将核心池大小设置为11,最大池大小设置为29,则actor系统将仅创建11个线程。如何配置ActorSystem
/ThreadPoolExecutor
继续创建线程以超过核心线程数并保持在最大线程数之内?我宁愿不要将核心线程数设置为最大线程数,因为我只需要多余的线程来取消作业(这应该是一个罕见的事件)。
我有一个针对Oracle数据库运行的批处理程序,该程序使用Java/Akka类型的actor和以下actor实现:
BatchManager
负责与REST Controller 进行对话。它管理未初始化的批处理作业的Queue
;当从队列中轮询未初始化的批处理作业时,它将变成JobManager
actor并执行。 JobManager
维护一个存储过程队列和一个Workers
池;它使用存储过程初始化每个Worker
,当Worker
完成后,它将过程的结果发送到JobManager
,然后JobManager
将另一个存储过程发送到Worker
。当作业队列为空且所有Workers
都空闲时,该批处理终止,此时JobManager
将其结果报告给BatchManager
,关闭其工作程序(通过TypedActor.context().stop()
),然后关闭自身。 JobManager
的Promise<Status> completion
在作业成功完成时或在由于取消或致命异常而终止作业时完成。 Worker
执行存储过程。它创建用于执行存储过程的OracleConnection和CallableStatement,并使用onFailure
注册JobManager.completion
回调以对连接进行abort
并对该语句进行cancel
。该回调不使用actor系统的执行上下文,而是使用从在BatchManager
中创建的缓存执行器服务创建的执行上下文。 {"akka" : { "actor" : { "default-dispatcher" : {
"type" : "Dispatcher",
"executor" : "default-executor",
"throughput" : "1",
"default-executor" : { "fallback" : "thread-pool-executor" }
"thread-pool-executor" : {
"keep-alive-time" : "60s",
"core-pool-size-min" : coreActorCount,
"core-pool-size-max" : coreActorCount,
"max-pool-size-min" : maxActorCount,
"max-pool-size-max" : maxActorCount,
"task-queue-size" : "-1",
"task-queue-type" : "linked",
"allow-core-timeout" : "on"
}}}}}
workerCount = 8
;
coreActorCount
是
workerCount + 3
,而
maxActorCount
是
workerCount * 3 + 5
。我正在具有两个内核和8GB内存的Macbook Pro 10上对此进行测试;生产服务器要大得多。我正在交谈的数据库位于极慢的VPN后面。我正在使用Oracle的JavaSE 1.8 JVM运行所有这些程序。本地服务器是Tomcat7。OracleJDBC驱动程序是10.2版(我也许可以说服使用较新版本的能力)。所有方法都返回
void
或
Future<>
,并且应该是非阻塞的。
JobManager#completion.tryFailure(new CancellationException("Batch cancelled"))
终止当前批次,则会触发
onFailure
注册的
Workers
回调,然后系统将变得无响应。调试printlns表示新批处理从八个正常工作的工作器中的三个开始,并且
BatchManager
变得完全无响应(我添加了一个
Future<String> ping
命令,该命令仅返回
Futures.successful("ping")
,并且也超时)。
onFailure
回调在一个单独的线程池上执行,即使它们在actor系统的线程池上,我也应该有足够高的
max-pool-size
来容纳原始的
JobManager
,其
Workers
,其
onFailure
回调以及第二个
JobManager
,即
Workers
。相反,我似乎要容纳原始的
JobManager
及其
Workers
,新的
JobManager
及其不到一半的
Workers
,而
BatchManager.
则一无所有我正在运行该计算机的计算机上资源不足,但似乎应该能够运行十几个线程。
CallableStatement
和
OracleConnection
被取消
CancellableStatements
System.out.println(mergedConfig.toString());
获得的
Config dump
Worker
参与者,并将其工作量转移到在固定大小的
Runnables
上执行的
ThreadPoolExecutor
中,其中每个
JobManager
创建自己的
ThreadPoolExecutor
并在批处理完成时将其关闭(正常终止时为
shutDown
,异常终止时为
shutDownNow
)。取消在
BatchManager
中实例化的缓存线程池上运行。 actor系统的调度程序仍然是
ThreadPoolExecutor
,但仅分配了六个线程。使用此备用设置,取消将按预期执行- worker 在其数据库连接中止时终止,并且新的
JobManager
会立即以完全补充的 worker 线程执行。这向我表明这不是硬件/JVM/Tomcat问题。
CallableStatement.close()
上,因此我对取消进行了重新排序,以便
OracleConnection.abort()
在
CallableStatement.cancel()
之前,从而解决了问题-所有取消操作(显然)都正确执行。但是,
Worker
线程继续卡在语句上-我怀疑我的VPN可能部分或全部归咎于此。
PerformanceAsync-akka.actor.default-dispatcher-19
at java.net.SocketInputStream.socketRead0(Ljava/io/FileDescriptor;[BIII)I (Native Method)
at java.net.SocketInputStream.read([BIII)I (SocketInputStream.java:150)
at java.net.SocketInputStream.read([BII)I (SocketInputStream.java:121)
at oracle.net.ns.Packet.receive()V (Unknown Source)
at oracle.net.ns.DataPacket.receive()V (Unknown Source)
at oracle.net.ns.NetInputStream.getNextPacket()V (Unknown Source)
at oracle.net.ns.NetInputStream.read([BII)I (Unknown Source)
at oracle.net.ns.NetInputStream.read([B)I (Unknown Source)
at oracle.net.ns.NetInputStream.read()I (Unknown Source)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1()S (T4CMAREngine.java:1109)
at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1()B (T4CMAREngine.java:1080)
at oracle.jdbc.driver.T4C8Oall.receive()V (T4C8Oall.java:485)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(ZZZZ)V (T4CCallableStatement.java:218)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(Z)V (T4CCallableStatement.java:971)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout()V (OracleStatement.java:1192)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal()I (OraclePreparedStatement.java:3415)
at oracle.jdbc.driver.OraclePreparedStatement.execute()Z (OraclePreparedStatement.java:3521)
at oracle.jdbc.driver.OracleCallableStatement.execute()Z (OracleCallableStatement.java:4612)
at com.util.CPProcExecutor.execute(Loracle/jdbc/OracleConnection;Ljava/sql/CallableStatement;Lcom/controller/BaseJobRequest;)V (CPProcExecutor.java:57)
最佳答案
(免责声明:我不知道Akka)
通过您的queue-size = -1的以下配置,我想任务队列是不受限制的。
"task-queue-size": "-1",
"task-queue-type": "linked"
If fewer than corePoolSize threads are running, the Executor always prefers adding a new thread rather than queuing. If corePoolSize or more threads are running, the Executor always prefers queuing a request rather than adding a new thread. If a request cannot be queued, a new thread is created unless this would exceed maximumPoolSize, in which case, the task will be rejected.
关于java - 无响应的actor系统: ThreadPoolExecutor dispatcher only creates core thread pool,显然会忽略最大线程池大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31304603/
我正在使用 boost.pool,但我不知道何时使用 boost::pool<>::malloc和 boost::pool<>::ordered_malloc ? 所以, boost::pool<>:
我目前正在尝试从 anaconda 中的 spy 控制台运行并行代码。我相信问题可能出在我的计算机不允许 anaconda 控制 CPU 核心上,但我不知道如何解决这个问题。 另一个有趣的点是,当我运
在了解 Python 的 multiprocessing 包(对于 Python 3.4 )时,我注意到 multiprocessing.Pool 是在类 BaseContext 中定义的 上下文.p
我有这样的程序: from multiprocessing import Pool import time def f(x): # I make a heavy code here to take t
我有一个模块 A,它通过获取数据并将其发送到模块 B、C、D 等进行分析,然后将它们的结果结合在一起来执行基本的 map/reduce。 但是模块 B、C、D 等似乎不能自己创建多处理池,否则我得到
所以我有一个脚本可以连接到大约 700 个设备并执行一系列命令,然后退出。我开始使用 Multiprocessing.Pool 和 Pool.map 来减少脚本的运行时间,并允许我同时登录多个设备。
在下面的链接中有对 Pool 类的 map 方法的解释。 它似乎阻塞直到结果准备好。这意味着不需要执行 pool.close(); pool.join() 在运行 pool.map 之后,但是它在 t
context 是 class multiprocessing.pool.Pool 构造函数中的可选参数。 Documentation只说: context can be used to specif
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: What's the difference between sending -release or -dra
不确定这是否是正确的论坛。 libvirt 页面链接在这里。如果这需要张贴在不同的地方请告诉我。 virsh pool-define-as 和 create-as 有什么区别?阅读 virsh 的手册
谁能告诉我Spring Cloud Feign Client是否提供或支持Http连接池,如果可以,那么如何配置诸如池大小的设置?我似乎在官方文档中找不到此内容。谢谢你。 最佳答案 通过调查,我将尝试
我在尝试运行 Flask 应用程序时遇到了一些困难。我收到以下导入错误: File "/db/mysql_utils.py", line 2, in import mysql.conne
我有一个 Node 项目,在其中使用 pg-pool 库。我已在我的依赖项中包含以下内容: "@types/pg-pool": "0.0.3", "pg": "^7.3.0", "pg-format"
在 python 2 中,multiprocessing.dummy.Pool 和 multiprocessing.pool.ThreadPool 之间有什么区别吗?源代码似乎暗示它们是相同的。 最佳
这个问题在这里已经有了答案: Concurrent.futures vs Multiprocessing in Python 3 (6 个答案) 关闭 5 年前。 请给我解释一下这两个类有什么区别?
multiprocessing 的文档states以下关于Pool.join() : Wait for the worker processes to exit. One must call clos
我找到了一些资源,但我不确定我是否理解。 我找到的一些资源是: http://help.sap.com/saphelp_nw70/helpdata/en/fc/eb2ff3358411d1829f00
我的 Javafx 应用程序抛出许多非法状态异常,我尚未能够在源中跟踪触发器。 任何人都可以指导我导致此问题的原因以及我应该在哪里查找原因。我很难在这里展示一些代码,因为我不知道是什么原因造成的。 任
参见下面的示例和执行结果: #!/usr/bin/env python3.4 from multiprocessing import Pool import time import os def in
我目前有一个连接到我的主数据库的开放池,它运行良好。但是现在,我想为另一个数据库打开一个新池。我完全按照设置第一个池的方式设置了新池,显然我编辑了数据库名称等。加载 setupHikari() 方法时
我是一名优秀的程序员,十分优秀!