如何知道我是否过度使用了多线程?


15

目前,我感觉我过度使用了多线程。

我有3种数据,A,B和C。

每个A都可以转换为多个B,每个B都可以转换为多个C

我只对Cs有兴趣。

我可以使用几个转换函数轻松地编写此代码。但我回过神来与线程执行它,三个队列(queue_aqueue_bqueue_c)。有两个线程进行不同的转换,一个工作线程:

  • ConverterA读取queue_a和写入queue_b
  • ConverterB读取queue_b和写入queue_c
  • Worker 处理来自 queue_c

转换相当平凡,我不知道这个模型是否太复杂了。但这对我来说似乎非常强大。每个“转换器”甚至可以在数据到达队列之前就开始工作,并且在代码中的任何时候我都可以“提交”新的As或Bs,它将触发转换管道,这反过来又将触发工作人员的工作。线。

甚至生成的代码看起来也更简单。但是我仍然不确定我是否在为简单的事情滥用线程。


5
我认为这个问题需要缩短一点以切入正题。标题也有误导性-听起来您将要冒充(尽管不是)。也许您应该问一个更接近“我怎么知道我是否过度使用多线程?”的问题。
KChaloux

@KChaloux我同意。我已经对其进行了编辑,希望它能更好地捕捉我的想法。
2013年

4
@exhuma太好了。您的-1变成+1
KChaloux13年

3
@KChaloux ...参观厕所会对您的思想过程产生影响... :)
exhuma 2013年

这本在线PDF书籍《成熟的优化手册》(仅在几天前发布)谈论系统影响,其中模块对整体系统性能的影响有时会超过模块执行时间的一部分。
rwong

Answers:


17

顺序思考几乎总是更简单,然后再修改该逻辑以使用线程更好地工作。而且,正如表达所说,“如果它没有损坏,请不要修复它”。大多数程序员不会仅仅因为不需要使用线程而使用线程。

如果您对使用它们感到更自在,则可以为您带来更多动力。但是,要知道,如果线程不能通过消除瓶颈来提高速度,则几乎可以肯定它们会减慢您的程序速度。

还应考虑将仅一个CPU专用于一个进程的系统将通过一个线程模拟多个线程以节省资源(现代计算机通常不会发生这种情况,尽管智能手机应用程序仍然很容易遭受这种滥用)。在这种情况下,即使您通过使用线程消除了瓶颈,它实际上也会比根本不使用线程的速度慢

而且,使用谨慎使用线程可能是最微妙的原因,但并非最不重要的当然不是最重要的,线程趋向于做您不希望做的事情。是的,如果您采取预防措施,就可以了。是的,如果您的线程不写线程之间共享的变量,那您就可以了。也就是说,很难找到与线程相关的错误。由于我的想法是程序员永远无法完全消除在代码中创建错误的可能性,因此程序员应该采取措施防止可能的错误,而不是专注于完全消除它们,因此,您绝对应该将这种想法应用于硬以及发现线程错误。换句话说,请注意,尽管您尽了最大努力,

那你还是应该使用线程吗?好吧,对线程的健康了解当然不是件坏事,尤其是如果您对此有所了解的话。但是,最近的趋势是转向单线程语言,例如node.js。拥有单个线程的主要优点之一是易于扩展,并且如果您知道指令将按顺序运行,则可以进行某些优化(即使优化可能意味着可以并行运行的指令也可以)。异步运行)。

就是说,我说做对您来说最舒服的事情。以我的经验,编写一个您理解的程序比使它更快地运行具有更高的优先级。只要确保在您认为线程可以帮助您编写程序时就使用线程即可,而不是因为您希望它能更快地工作,因为在编写程序时不必担心性能问题(优化很重要,但是也可以等待)。


您在提出有趣的观点。就我而言,转换管道与性能无关。它与代码的简单性/可读性有关。工作线程关于性能。每个最终任务都在远程计算机上运行,​​并且提交多个作业使它的运行速度大大提高。
2013年

2
@exhuma除了通过多个线程并行执行之外,您还可以使用异步技术,例如Futures / Promises或面向回调的样式。注意,您可以通过链接迭代器/流来对管道进行建模。没有必要对实际使用的线程-如果你想利用多个CPU,除了(在网络代码,这是几乎从来没有的情况下)
阿蒙

@exhuma是的,线程通常可以提高性能。我的观点是,如果因为速度太慢而没有这样做,则应该这样做,因为它可以帮助您编写程序。优化应该总是在以后。甚至可能是从程序中删除线程正在对其进行优化(尽管对于大多数程序员而言并非如此)。
Neil

OT:我爱你的头像。让我笑。
Marjan Venema 2013年

@exhuma,我同意这个答案,但是我要补充一点,如果您打算使用线程来简化代码,那很好,但是要非常小心,因为您了解线程安全性和具有多个线程的潜在问题。看起来很简单的多线程代码片段很容易具有隐藏的竞争条件,这可能导致各种很难追踪的错误。
李·李
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.