trv*_*rrp 2 python python-multithreading python-2.7
我在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"
Run Code Online (Sandbox Code Playgroud)
我对此的期望是:
Starting now
Spam, Spam, Spam
Spam, Spam, Spam
Spam, Spam, Spam
** user hits enter **
Stopping now
Run Code Online (Sandbox Code Playgroud)
这就是给我的:
>>>
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 ================================
Run Code Online (Sandbox Code Playgroud)
在我重新启动终端之前,它一直在打印。当我用threading.sleep()替换raw_input()命令以暂停一段时间时,它按预期工作。在我看来,raw_input()某种程度上阻止了foo()中的Timer执行。
为什么这没有按我预期的那样工作?是否应该出于某种原因像这样工作,还是我错过了一些东西?
任何帮助,将不胜感激。谢谢!
您的代码看起来不错,并且可以在Linux和Windows上使用。我认为您遇到了IDLE解释器的局限性,该解释器往往与multiprocessing和threading基于代码的问题有关。我只是建议不要尝试从IDLE中运行您的代码。
| 归档时间: |
|
| 查看次数: |
1451 次 |
| 最近记录: |