我在 python 中遇到线程问题,问题似乎是当我调用一个线程并随后调用 raw_input() 时会阻塞该线程。这是最小的例子
import threading
import time
class tread_test(threading.Thread):
def __init__(self):
self.running = True
threading.Thread.__init__(self)
#
def run(self):
self.foo()
#
def foo(self):
print "Spam, Spam, Spam"
self.task = threading.Timer(0.5, self.foo)
self.task.start()
#
def stop(self):
self.running = False
self.task.cancel()
#
#
if __name__ == "__main__":
a = tread_test()
print "Starting now"
a.start()
raw_input()
a.stop()
print "Stopping now"
我对此的期望是:
Starting now
Spam, Spam, Spam
Spam, Spam, Spam
Spam, Spam, Spam
** user hits enter **
Stopping now
这给了我什么:
>>>
Starting now
Spam, Spam, Spam
** After several seconds user hits enter **
Traceback (most recent call last):
File "C:\file\test.py", line 37, in <module>
a.stop()
File "C:\file\test.py", line 28, in stop
self.task.cancel()
AttributeError: 'tread_test' object has no attribute 'task'
>>> Spam, Spam, Spam
Spam, Spam, Spam
Spam, Spam, Spam
Spam, Spam, Spam
Spam, Spam, Spam
Spam, Spam, Spam
Spam, Spam, Spam
================================ RESTART ================================
它一直打印出来,直到我重新启动终端。当我用 threading.sleep() 替换 raw_input() 命令以暂停一段时间时,它会按预期工作。在我看来, raw_input() 以某种方式阻止了 foo() 中的计时器执行。
为什么这没有像我预期的那样工作?出于某种原因它应该像这样工作,还是我错过了什么?
任何帮助,将不胜感激。谢谢!