当前位置: 首页 > 面试题库 >

多线程性能开销

周墨一
2023-03-14
问题内容

所以基本上我创建了这个程序,为redis添加了值。到目前为止,我得到了这个时机:

real 0m27.759s
user 0m18.129s
sys  0m5.580s

但是,当我尝试运行多个线程时:

if __name__ == '__main__':
    try:
        for x in range(0, NUM_THREADS):
            Thread(None, startProgram, None,
                   (NUM_HOSTS/NUM_THREADS*x+1,
                    NUM_HOSTS/NUM_THREADS*(x+1))).start()
    except Exception as errtxt:
        print errtxt

我用NUM_THREADSset ot得到这个10

real 0m32.642s
user 0m22.953s
sys  0m11.473s

为什么我的程序在有 更多 线程的情况下运行 速度较慢 ? __

我正在运行Linux Ubuntu 11.04和Python 2.7.1。


问题答案:

结果取决于Python的实现,cpython的GIL阻止了并行计算比顺序计算更快。

考虑使用该multiprocessing模块,该模块在其自己的Python进程中执行每个线程,或者使用其他非GIL的Python实现,例如IronPython和Jython。



 类似资料:
  • 问题内容: 为了在Linux上开发高度网络密集型服务器应用程序,首选哪种架构?这个想法是,该应用通常可以在具有多个内核(虚拟或物理)的机器上运行。考虑到性能是关键标准,选择多线程应用程序还是采用多进程设计更好?我确实知道资源共享和从多个进程访问此类资源的同步是很多编程开销,但是如前所述,整体性能是关键要求,因此我们可以忽略这些事情。编程语言为C / C ++。 我听说,即使是多线程应用程序(单个进

  • 问题内容: 最近,我完成了一个项目,该项目比以前需要更多的IO交互,我觉得我想超越常规库(尤其是Common IO),并解决一些更深入的IO问题。 作为一项学术测试,我决定实现一个基本的多线程HTTP下载程序。这个想法很简单:提供要下载的URL,然后代码将下载文件。为了提高下载速度,将文件分块,并同时下载每个块(使用HTTP 标头)以使用尽可能多的带宽。 我有一个可以正常工作的原型,但是正如您可能

  • 问题内容: 我正在编写Node插件,尝试从C ++工作线程调用V8函数对象时遇到问题。 我的插件基本上是启动一个C std :: thread并使用WaitForSingleOject()进入一个等待循环,这是由另一个C 应用程序(一个X- Plane插件)向共享内存中写入数据触发的。我试图让我的Node插件在发出Windows共享事件信号时唤醒,然后调用我从node应用程序注册的JavaScri

  • 我对最新gcc中基于pthread和Ubuntu开发环境的线程的互斥锁和消息传递的性能感兴趣。一个很好的通用问题是用餐哲学家,每个哲学家使用lh和rh叉子与左右手邻居共享。我把哲学家的数量增加到99个,让我的四核处理器保持忙碌。 上面的代码允许我的哲学家尝试抓住他们需要的两个叉子。 上面的代码监控我的哲学家的进食或思考进度,这取决于他们是否能够保留这两个叉子。 在所有哲学家尝试自由选择后,等待所有

  • 我使用StringRedisTemplate向redis添加条目,如下所示。 我必须显式添加线程安全功能吗?我在StringRedisTemplate或RedisTemplate源中没有看到任何synchronize关键字。

  • 8.1节中,我们看到了各种划分方法;并且在8.2节,了解了对性能影响的各种因素。如何在设计数据结构的时候,使用这些信息提高多线程代码的性能?这里的问题与第6、7章中的问题不同,之前是关于如何设计能够安全、并发访问的数据结构。在8.2节中,单线程中使用的数据布局就会对性能产生巨大冲击(即使数据并未与其他线程进行共享)。 关键的是,当为多线程性能而设计数据结构的时候,需要考虑竞争(contention