线程无法正常工作

时间:2014-03-19 19:11:26

标签: python multithreading python-3.x

我尝试使用threading模块测试某些内容,但我真的很困惑为什么这不起作用。我也使用Windows 8,但我在linux虚拟机上尝试了这个确切的代码并得到了相同的结果,我使用的是错误的线程吗?

import threading


# test.py 
class Test:
    def __init__(self):
        self.connect()
    def connect(self):
        threading.Thread(target=self.loop, daemon=True).start()

    def loop(self):
        while True:
            print("works?")
Test()

所以如果我在IDLE中运行它可以正常工作但是只要我在命令提示符下尝试它就打印出#34;有效吗?"一次然后冻结,我也不能发送kill命令。

如果我删除threading.Thread(target=self.loop, daemon=True).start()并将其替换为self.loop(),则在命令提示符下工作正常。为什么使用threading.Thread(target=self.loop, daemon=True)无效?

有关如何让它在命令提示符下工作的任何建议?

2 个答案:

答案 0 :(得分:2)

看起来你应该构建一个Thread而不是构建一个使Thread使用其中一种方法的类!

class Test(threading.Thread):
    def __init__(self, **kwds):
        super(Test, self).__init__(**kwds)
        self.daemon = True

    def run(self):
        while True:
            print("works?")
t = Test()
t.start()

至于为什么你的代码在IDLE中运行而不在命令行,我恐怕不知道。如果一个更有经验的Python-er想要用更完整的解释来编辑这个答案,他们当然应该随意!

答案 1 :(得分:0)

我发现了问题,我的所有活动线程都是守护进程(需要它们才能在Windows上使用ctrl c杀死它们)所以一旦任务完成,它们就会退出。 Python可能将IDLE shell计为非守护线程,因此它能够继续运行,但命令提示符或终端不计为线程,因此它立即退出,这是一个修复。

import threading

class Test:
    def __init__(self):
        self.connect()
    def connect(self):
        threading.Thread(target=self.loop, daemon=True).start()

    def loop(self):
        while True:
            print("works?")
NEEDS_STARTED = True
while True:
    if NEEDS_STARTED:
        Test()

或者

import threading

class Test:
    def __init__(self):
        self.connect()
    def connect(self):
        threading.Thread(target=self.loop).start()

    def loop(self):
        while True:
            print("works?")

感谢您的建议和意见。如果有人能够解释为什么它没有使用更好的解释,那么有人会遇到类似的问题。