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

线程Thread-1中的Python异常(最有可能在解释器关闭期间引发)?

祁飞飙
2023-03-14
问题内容

我和我的朋友一直在从事一个大型项目,以在python和PyGame中学习和娱乐。基本上,这是一个小村庄的AI模拟。我们想要一个昼夜循环,所以我找到了一种使用numpy改变整个表面颜色的巧妙方法(特别是交叉淡入淡出的教程)-http://www.pygame.org/docs/tut/surfarray/SurfarrayIntro
。 html

我将其实现到代码中,并且可以正常工作,但是速度非常慢,例如<1
fps慢。所以我研究了线程(因为我想最终添加它),并在Queues上找到了此页-了解python中的Queue模块(如何运行)

我花了大约15分钟来制作一个基本系统,但是一旦我运行它,窗口就会关闭并且它说

Exception in thread Thread-1 (most likely raised during interpreter shutdown):

编辑:这就是它所说的一切,没有回溯错误

我不知道自己在做什么错,但是我想我缺少一些简单的东西。我在下面的代码中添加了必要的部分。

q_in = Queue.Queue(maxsize=0)

q_out = Queue.Queue(maxsize=0)

def run():    #Here is where the main stuff happens
    #There is more here I am just showing the essential parts
    while True:
        a = abs(abs(world.degree-180)-180)/400.

        #Process world
        world.process(time_passed_seconds)

        blank_surface = pygame.Surface(SCREEN_SIZE)
        world.render(blank_surface)    #The world class renders everything onto a blank surface
        q_in.put((blank_surface, a))
        screen.blit(q_out.get(), (0,0))

def DayNight():
    while True:
        blank_surface, a = q_in.get()
        imgarray = surfarray.array3d(blank_surface)  # Here is where the new numpy       stuff starts (AKA Day/Night cycle)
        src = N.array(imgarray)
        dest = N.zeros(imgarray.shape)
        dest[:] = 20, 30, 120
        diff = (dest - src) * a
        xfade = src + diff.astype(N.int)

        surfarray.blit_array(blank_surface, xfade)
        q_out.put(blank_surface)
        q_in.task_done()

def main():
    MainT = threading.Thread(target=run)
    MainT.daemon = True
    MainT.start()

    DN = threading.Thread(target=DayNight)
    DN.daemon = True
    DN.start()

    q_in.join()
    q_out.join()

如果有人可以帮助,将不胜感激。谢谢。


问题答案:

使用守护程序线程时,这很常见。为什么要.daemon = True在线程上设置?想一想。尽管守护程序线程有合法用途,但 大多数情况下
程序员会这样做,因为它们很困惑,例如“我不知道如何彻底关闭线程,否则,程序将在退出时冻结,所以我知道!我将说它们是守护程序线程。然后,解释器将不等待它们退出时终止。问题已解决。”

但这并没有解决-
通常只会带来其他问题。特别是,守护程序线程将继续运行,而解释器将在退出时自行销毁。模块被销毁,stdin和stdout和stderr被销毁,等等,等等。然后,由于它们试图访问的东西被歼灭,各种事情都可能在守护程序线程中出错。

您看到的特定消息是在某个线程中引发异常时产生的,但是到目前为止,解释器的销毁甚至使该sys模块不再包含任何可用的东西。该线程执行保留的引用sys.stderr内部,以便它可以告诉你
的东西 ,然后(具体而言,您所看到的确切消息),但过多的解释器已被摧毁告诉你别的什么地方出了错。

因此,找到一种方法来彻底关闭线程(并删除.daemon = True)。对您的问题了解不足,无法提出具体的方法,但是您会想到的;-)

顺便说一句,我建议删除构造maxsize=0函数上的参数Queue()。默认值为“无界”和“每个人都知道”,而很少有人知道这maxsize=0也意味着“无界”。随着其他数据类型已经maxsize=0表示“最大大小确实为0”(最好的例子是collections.deque),情况变得更糟。但是“没有论据意味着无限”仍然普遍存在。



 类似资料:
  • 但当我忘记将语句放入try-with-resources语句时,关闭方法是不是不调用? 在试用资源中,关闭称为 在流api中,关闭被称为 例如,离开创建资源的方法时,由java自动执行??? 我在互联网上搜索了其他信息,并查看了文档。两人都建议删除throws Exception语句。但是我对这个建议的反应是,当将来我们的项目中有人实现了新的接口(毫无例外),并且忘记了将它们放入try-with-

  • 问题内容: 我正在JavaFX项目上工作,但出现这样的错误: 我的MainApp.java 我的RootLayoutController.java RootLayout.fxml DrawerContentController.java DrawerContent.fxml 当我单击DefaultContentController中的注销按钮时,发生错误,显示“注销”消息,但我不理解该错误。请帮助

  • 我刚刚开始学习c#中的线程和方法调用,但我遇到了一个无法解决的问题。 我做了一个基本的C#表单程序,通过启动一个线程和调用委托,不断更新和显示一个数字。 在Form1_load开始新的线程: Public void始终显示此消息(该消息会不断更新号码): 现在,当我单击表单的X按钮时,出现以下异常: 类型System的未处理异常。发生在System.窗户。Forms.dll 无法更新已删除对象的

  • 问题内容: 我有一个Python程序,当我使用退出应用程序时 ,脚本不会关闭。我的过程仍显示在运行的过程中。 为什么python线程不能关闭? 问题答案: 您需要将该线程设为守护程序线程。为此,请在调用线程的init之后添加以下行 当只有守护程序线程处于活动状态时,程序将退出,主线程当然是非守护程序的

  • 问题内容: 当脚本由于异常退出时,打开的文件(和其他资源)是否会自动关闭? 我想知道在异常处理期间是否需要关闭资源。 编辑 :更具体地说,我正在脚本中创建一个简单的日志文件。我想知道在例外情况下是否需要担心显式关闭日志文件。由于我的脚本有一个复杂的,嵌套的try / except块,因此这样做有些复杂,因此,如果python,CLIB或OS在脚本崩溃/出错时要关闭我的文本文件,我就不想在确保关闭文

  • 想改进这个问题吗 通过编辑此帖子,添加详细信息并澄清问题。 我在“联系人”类中有一个静态类“电子邮件”。在测试中,我有一个例外: 这是测试中的代码: 电子邮件1和联系人。电子邮件是电子邮件类的对象,不是吗?

  • 我使用谷歌云平台用Spark(2.0.2)制作图像处理。当我执行我的代码(Java)时,我会得到以下错误: [Stage 1:>(0+0)/2]17/10/15 13:39:44 WARN org.apache.spark.scheduler.tasksetManager:Stage 1包含一个非常大的任务(165836 KB)。建议的最大任务大小为100 KB。

  • 我想在hibernate中进行一对多映射,但它显示出异常,我尝试了很多,但找不到解决方案 我有下面两张桌子 deptno--数字主键dname--varchar2(10) loc--varchar2(10) empno--数字主键 用户名--varchar2(10) deptno--数字(10)外键 当我没有在Dept.java类上添加@Entity注释时,我会在stacktrace下面看到 当我