- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想我用错了线程,所以我想问一下这是否是好的设计。基本上我有一个程序从队列中提取数据然后处理它(处理是纯数学所以它是 100% cpu 密集型),然后如果数据是好的它发送到一个“好”队列否则它要么完全丢弃要么部分丢弃被发送回初始“工作”队列以进行进一步处理。这是它的高级逻辑,当我的队列在内存中时,我的程序使用了所有内核并且速度非常快。随着我的数据的增长,我决定使用队列服务器来存储队列,然后将处理分布到多台机器上,但现在速度很慢(每个内核只使用了 40%-60%)。
我尝试分析我的代码(使用 yourkit 和 netbeans 中的内置代码),它说大部分时间 (80%) 都花在了队列程序上。我想我可以通过将所有外部程序内容推送到另一个线程来让我的程序中的数字运算不断进行,但这对性能没有帮助,我想知道我是否做错了。我不确定,但我想知道如果从现有线程(父线程)启动一个线程(子线程),子线程是否必须在父线程完成之前完成?
我的代码非常大,99% 都不需要,所以我只写一个高级版本(它可能无法编译,但应该让您了解我在做什么)。
public class worker {
private static ExecutorService executor;
static {
final int numberOfThreads = 4;
executor = new ThreadPoolExecutor(numberOfThreads, numberOfThreads, 1000, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>());
}
public static void main(String[] args) throws IOException, ShutdownSignalException, ConsumerCancelledException, InterruptedException {
// TODO Auto-generated method stub
System.out.println("starting worker..");
//Connection information goes here
channel.basicQos(50); //this is part of the connection, the queue server only gives 50 messages without acknowledgment
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery(); //gets data from queue
String message = new String(delivery.getBody());
executor.submit(new DoWork(channel, message, delivery));
}
class DoWork implements Runnable{ //where the main work happens
//setup variables, basically passing queue connection information as well as data here, so I only need to rely on one connection
public void run() {
new Thread(new Awk_to_Queue(channel, delivery)).start(); //this sends an Awk_to_Queue to the queue, I launch a thread for this so my program can keep working.
if (data is good) {
new Thread(new Send_to_Queue("success_queue", message1, channel)).start();
continue;
} else if (Data is not good but not bad either ) {
new Thread(new Send_to_Queue("task_queue", message2, channel)).start();
}
class Send_to_Queue implements Runnable{
public void run() {
//takes data in and sends to queue in the way I used to previous do it, but just does it in a thread. queue connection is passed over so I only need to have one connection
}
}
class Awk_to_Queue implements Runnable{
public void run() {
//awk's queue so queue server can send one more piece of data to queue up
}
}
就是这样。如果它有点难以阅读,我很抱歉(我删除了很多东西只是为了向您展示我正在做的事情的结构)。 fork 线程不影响速度我做错了什么(它没有看到它运行得更快,分析器的结果也没有改变)?是我 fork 线程的方式有问题( new Thread(new Awk_to_Queue(channel, delivery)).start();
)还是像我的线程设计一样?
最佳答案
我想到了两件事:
1) 唯一读取 远程队列的线程似乎是在 main() 方法中运行无限循环的主线程。无论您将东西塞入其中的速度有多快,处理它们的速度永远不会快于取出它们的速度。
2) 产生 new Thread();
是一个“昂贵”的操作。不断地为单个短任务创建新线程只是在内存分配和 native 资源之间搅动。您应该将这些“队列放置”卸载到第二个 ExecutorService
,您可以调整其大小,而不是生成无限数量的线程。
关于java - fork 线程并没有加快我的程序,我在我的情况下是否正确使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10182465/
这个问题已经有答案了: How to do case insensitive string comparison? (23 个回答) 已关闭 3 年前。 用户在我的输入栏中写入“足球”,然后执行第 6
啊,不习惯 javascript 中的字符串。 character_id= + id + correct= + correctOrIncorrect 这就是我需要制作成字符串的内容。如果您无法猜测字符
$(function() { var base_price = 0; CalculatePrice(); $(".math1").on('change', function(e) { Calc
我找不到任何文章回答问题:将Spinnaker部署到Spinnaker将管理的同一Kubernetes集群是否安全/正确?我主要是指生产,HA部署。 最佳答案 我认为Spinnaker和Kuberne
我正在使用MSVC在Windows上从源代码(官方源代码发布,而不是从仓库中)构建Qt5(Qt 5.15.0)。 我正在设置环境。变量,依赖项等,然后运行具有1600万个选项的configure,最后
我需要打印一个包含重复单词的数组。我的数组已经可以工作,但我不知道如何正确计算单词数。我已经知道,当我的索引计数器 (i) 为 49 时,并且当 (i) 想要计数到 50 时,我会收到错误,但我不知道
我正在遵循一个指南,该指南允许 Google map 屏幕根据屏幕尺寸禁用滚动。我唯一挣扎的部分是编写一个代码,当我手动调整屏幕大小时动态更改 True/False 值。 这是我按照说明操作的网站,但
我有一个类“FileButton”。它的目的是将文件链接到 JButton,FileButton 继承自 JButton。子类继承自此以使用链接到按钮的文件做有用的事情。 JingleCardButt
我的 friend 数组只返回一个数字而不是所有数字。 ($myfriends = 3) 应该是…… ($myfriends = 3 5 7 8 9 12). 如果我让它进入 while 循环……整个
这个问题在这里已经有了答案: Is there a workaround to make CSS classes with names that start with numbers valid?
我正在制作一个 JavaScript 函数,当调整窗口大小时,它会自动将 div 的大小调整为与窗口相同的宽度/高度。 该功能非常基本,但我注意到在调整窗口大小时出现明显的“绘制”滞后。在 JS fi
此问题的基本视觉效果可在 http://sevenx.de/demo/bootstrap-carousel/inc.carousel/tabbed-slider.html 获得。 - 如果你想看一看。
我明白,如果我想从函数返回一个字符串文字或一个数组,我应该将其声明为静态的,这样当被调用的函数被返回时,内容就不会“消亡”。 但我的问题是,当我在函数内部使用 malloc 分配内存时会怎样? 在下面
在 mySQL 数据库中存储 true/false/1/0 值最合适(读取数据消耗最少)的数据字段是什么? 我以前使用过一个字符长的 tinyint,但我不确定它是否是最佳解决方案? 谢谢! 最佳答案
我想一次读取并处理CSV文件第一行中的条目(例如打印)。我假设使用Unix风格的\n换行符,没有条目长度超过255个字符,并且(现在)在EOF之前有一个换行符。这意味着它是fgets()后跟strto
所以,我们都知道 -1 > 2u == true 的 C/C++ 有符号/无符号比较规则,并且我有一种情况,我想有效地实现“正确”比较。 我的问题是,考虑到人们熟悉的尽可能多的架构,哪种方法更有效。显
**摘要:**文章的标题看似自相矛盾。 本文分享自华为云社区《Java异常处理:如何写出“正确”但被编译器认为有语法错误的程序》,作者: Jerry Wang 。 文章的标题看似自相矛盾,然而我在“正
我有一个数据框,看起来像: dataDemo % mutate_each(funs(ifelse(. == '.', REF, as.character(.))), -POS) # POS REF
有人可以帮助我使用 VBScript 重新格式化/正确格式化带分隔符的文本文件吗? 我有一个文本文件 ^分界如下: AGREE^NAME^ADD1^ADD2^ADD3^ADD4^PCODE^BAL^A
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我是一名优秀的程序员,十分优秀!