我尝试使用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)
无效?
有关如何让它在命令提示符下工作的任何建议?
答案 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?")
感谢您的建议和意见。如果有人能够解释为什么它没有使用更好的解释,那么有人会遇到类似的问题。