gpt4 book ai didi

python - 线程卡住(python w/GTK)

转载 作者:太空宇宙 更新时间:2023-11-04 03:59:16 26 4
gpt4 key购买 nike

基本上我有一个启动新线程的程序,然后尝试在这个新线程中做一些事情。但是,新线程似乎卡住了,直到主线程到达程序末尾。

这是我遇到的问题的一个工作示例。似乎 gtk.main() 必须存在才能发生此问题。如果我改用 input() 之类的东西,问题就不会出现。

import threading,sys
class MyThread(threading.Thread):
def run(self):
import time
print('before')
time.sleep(3)
print('after')

MyThread().start()

from gi.repository import Gtk as gtk

class My_window:
def __init__(self):
self.window = gtk.Window()
self.window.connect("delete_event", gtk.main_quit)
self.button = gtk.Button("Hello World")
self.window.add(self.button)
self.button.show()
self.window.show()

My_window()
gtk.main()

应该发生什么:窗口出现,出现之前的词,3秒后出现之后的词

真正发生了什么:窗口出现,前面的词出现,然后什么都没有发生。当您关闭窗口时,会出现之后的字样。 (好像以某种方式到达程序末尾使之前卡住的所有正在运行的线程再次运行)

我尝试过的事情:

  • 将 time.sleep 替换为其他函数,例如终端命令或忙循环。我得到了相同的结果

  • 我尝试在没有窗口和其他额外内容的情况下重现问题,但没有成功。所以我不知道这个问题出在哪里,所以我提供了所有可能的背景信息。

  • 我尝试使用 sys.stdout.flush() 来确保文本在应该显示的时候实际显示在命令行中。是的。

有人对问题可能有什么建议吗?

我正在使用 python 3(和窗口的 gtk),并且希望我的程序在所有主要操作系统上都兼容

编辑:

我尝试在 gtk.main() 之前放置一个 print('starting')。输出显示之前然后开始然后之后。我在想调用 gtk.main 会卡住所有线程,当 gtk.main 结束时,线程会恢复。

编辑 2:没关系,在我原来的程序中,线程是在 gtk.main 运行时创建的,但 gtk.main 中仍然可能有一些东西正在卡住线程,每隔一段时间就会被调用一次。

最佳答案

我设法重现了这个,并花了很长时间试图找出它失败的原因,直到我遇到 this FAQ entry , 这建议把...

import gobject
gobject.threads_init()

...在代码的顶部,这似乎解决了问题。

我的猜测是,在调用 gtk.main() 之后,GTK 保留了 Python 的 Global Interpreter Lock。 ,这对于默认行为来说有点顽皮,但至少有一种方法可以防止它。

请注意,后台线程无法直接操作 GTK 对象,因此您必须让它们将消息传递给主线程来执行此操作。

关于python - 线程卡住(python w/GTK),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16626451/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com