算法应该创建一个新线程?

时间:2009-11-27 13:33:47

标签: python math multithreading

是否有一种算法可以检查创建新线程是否能够带来性能? 我将设置最多可以创建的线程,但如果我只添加一个任务,那么为此启动一个新线程将不是一个优势。 我使用的编程语言是python。

编辑1#

这个问题甚至可以回答,还是一般性问题,因为它取决于线程的工作原理?

4 个答案:

答案 0 :(得分:4)

python(至少是标准的CPython)是一个特例,因为它不会一次运行多个线程,因此如果你在多核上进行数字运算,那么纯python实际上不是最好的选择。

在CPython中,运行python代码时,只有一个线程正在执行。它受Global Interpreter Lock保护。如果你正在进行IO或睡觉或等待另一方面,那么python线程是有意义的。

如果你是数字运算,那么你可能想要在C-extension中做到这一点。没有multiprocessing library为纯python代码提供了一种利用多核的方法。

一般情况下,非python案例:问题无法回答,因为它取决于:

  1. 新线程上的运行任务是否会更快>
  2. 启动新主题的成本是多少?
  3. 这些任务包含哪些工作? (IO绑定,CPU绑定,网络绑定,用户绑定)
  4. 操作系统调度线程的效率如何?
  5. 这些任务需要多少共享数据/锁定?
  6. 任务之间存在哪些依赖关系?
  7. 如果你的任务是独立的并且受CPU限制,那么每个CPU核心运行一个可能是最好的 - 但是在python中你需要多个进程来利用它们。

答案 1 :(得分:3)

经验法则:如果一个线程要进行输入/输出,则可能值得将它分开。

如果正在进行数字运算,那么最佳线程数就是CPU数量。

答案 2 :(得分:0)

测试会告诉你。

基本尝试和基准测试。

答案 3 :(得分:0)

对此没有一般答案......但有一个趋势。由于计算机获得越来越多的CPU核心(尝试购买新的单CPU PC ......),使用线程成为事实上的标准。

因此,如果您有一些可以并行化的工作,那么一定要使用线程模块并创建一个工作池。在最坏的情况下(这只是一个线程),这不会使你的代码慢得多,但如果用户拥有更强大的PC,它可以使代码更快。

在最糟糕的情况下,您的程序将在不到100毫秒后完成 - >人们不会注意到减速,但他们会注意到8芯的加速。