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

Python线程异常慢

唐麒
2023-03-14
问题内容

我已经决定学习如何在Python中完成多线程,并且进行了比较以查看在双核CPU上可以获得什么样的性能提升。我发现我的简单多线程代码实际上比顺序运行的慢,我不知道为什么。

我进行的测试是生成大量随机数,然后打印最大数量

from random import random
import threading

def ox():
    print max([random() for x in xrange(20000000)])

ox()在我的Intel Core 2 Duo上完成大约需要6秒,而ox();ox()大约需要12秒。

然后,我尝试从两个线程调用ox()来查看完成的速度。

def go():
    r = threading.Thread(target=ox)
    r.start()
    ox()

go()大约需要18秒才能完成,并且两个结果会在彼此之间的1秒钟内打印出来。为什么要慢一点?

我怀疑ox()它是自动并行化的,因为如果我查看Windows任务管理器的“性能”选项卡,并ox()在我的python控制台中调用,则两个处理器的利用率都将提高到大约75%,直到完成为止。Python是否会自动并行化事物max()


问题答案:
  1. Python具有GIL。Python字节码一次只能由一个处理器执行。只有某些C模块(不管理Python状态)才能同时运行。
  2. Python GIL在锁定线程之间的状态方面有巨大的开销。在较新的版本或开发分支中已对此进行了修复-至少应使多线程CPU绑定代码与单线程代码一样快。

您需要使用多进程框架与Python并行化。幸运的是,Python附带的多处理模块使这一操作相当容易。

很少有语言可以自动并行化表达式。如果这是您想要的功能,我建议使用Haskell(数据并行Haskell)



 类似资料:
  • 问题内容: 假设线程是从main方法启动的。如果在线程中引发异常但未在线程中处理异常,会发生什么情况? 是否可以将异常传播回main方法? 问题答案: 我们正在谈论方法抛出的未经检查的异常。默认情况下,您会在系统错误中得到以下信息: 这是printStackTrace处理未处理异常的结果。要处理它,您可以添加自己的UncaughtExceptionHandler: 要为所有线程设置处理程序,请使用

  • 这是我的代码: 我正在获取NetworkOnMainThreadException。我认为问题出在httppost中,但我无法解决。

  • 最近我正在学习Spring框架。所以我正在尝试检查依赖注入在Spring框架中的工作原理。因此,我创建了一个新的java项目并使用基于构造函数XML的配置练习依赖注入代码。运行我的项目后,我收到了这个错误...... 类路径资源[com/mir00r/beans.XML]的XML文档中的第24行无效;嵌套异常为组织。xml。萨克斯。SAXParseException;行号:24;列数:9;cvc复

  • 我正在学习selenium并尝试运行以下代码,但它引发了异常。NoSuchFieldError:空字节数组。请帮助我理解这个简单的程序出了什么问题。 控制台: 异常线程"main"java.lang.NoSuchFieldError:EMPTY_BYTE_ARRAY

  • 问题内容: 我对Python和多线程编程非常陌生。基本上,我有一个脚本可以将文件复制到另一个位置。我希望将其放置在另一个线程中,以便可以输出以指示脚本仍在运行。 我遇到的问题是,如果无法复制文件,它将引发异常。如果在主线程中运行,这没关系;但是,使用以下代码不起作用: 在线程类本身中,我尝试重新抛出异常,但是它不起作用。我已经看到这里的人问类似的问题,但是他们似乎都在做比我想做的事情更具体的事情(

  • 问题内容: 我正在运行以下简单代码: 但是当我运行它时,它会打印 实际上python线程会忽略我的+键盘中断而无法打印。为什么?此代码有什么问题? 问题答案: 尝试 没有对的调用,主要过程是过早地跳出该块,因此不会被捕获。我的第一个想法是使用,但这似乎阻塞了主进程(忽略KeyboardInterrupt),直到完成。 导致线程在主进程结束时终止。