Python线程中的无限循环

时间:2016-05-15 15:58:23

标签: python multithreading python-3.x

所以我在一个类中运行了两个python线程。我已经使用

进行了检查
threading.active_count()

它说两个线程都在运行。第一个线程包括一个工作正常的tkinter窗口。我用作第一个窗口的事件管理器的第二个线程,它本身也可以正常工作。但是,当我在第一个线程旁边运行第二个线程时,第一个线程不起作用,即。窗口没有出现。即使首先执行第一个线程,这也是如此。当我从第二个线程中删除无限循环时,第一个线程再次起作用,有人可以向我解释这个吗?这是班级:

class Quiz(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)


    def show(self, question):
        self.question = quiz[question][0]
        self.correct = quiz[question][1]
        self.incorrectA = quiz[question][2]
        self.incorrectB = quiz[question][3]
        self.ref = quiz[question][4]
        questionDisplay.config(text=self.question)
        correctButton = "answer" + str(self.ref[0])
        eval(correctButton).config(text=self.correct, command=lambda : check(True))
        incorrect1 = "answer" + str(self.ref[1])
        eval(incorrect1).config(text=self.incorrectA, command= lambda : check(False))
        incorrect2 = "answer" + str(self.ref[2])
        eval(incorrect2).config(text=self.incorrectB, command= lambda : check(False))
        return self.correct

    def run(self):
        print("thread started")
        print(threading.active_count())

        while True:
            print(questionQueue.qsize())
            if questionQueue.qsize() >= 1:
                pass

            else:
                pass
            print("looped")

由于

1 个答案:

答案 0 :(得分:1)

从目前显示的代码中,问题出在哪里并不明显。但请记住以下几点;

Tk是基本上所有GUI工具包的事件驱动。因此,要使GUI工作,您需要运行Tk' mainloop。它在主循环中运行的代码中唯一的部分是附加到按钮,菜单和计时器等各种回调。

与大多数GUI工具包一样,由于需要的开销,Tk不是线程安全的。为了使其正常工作,您应该只从一个线程中调用Tk函数和方法。

Python的线程是操作系统线程。这意味着它们受操作系统调度的影响。操作系统有时会为繁忙的线程提供更多时间。因此,如果在繁忙循环中旋转的线程被抢占(如定期执行),则可能最终再次运行而不是GUI线程。