Python线程化问题,RAW_INPUT()阻塞线程,失控线程

问题描述

我在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	est.py", line 37, in <module>
    a.stop()
  File "C:file	est.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 ================================

在那里它一直打印出来,直到我重启终端。当我将RAW_INPUT()命令替换为threading.sleep()以暂停一段时间时,它会按预期工作。在我看来,RAW_INPUT()以某种方式阻止了foo()中的计时器执行。

为什么这不像我预期的那样工作?它是出于某种原因才应该这样工作的,还是我错过了什么?

如有任何帮助,我们将不胜感激。谢谢!


解决方案

您的代码看起来很好,我可以在linux和Windows上运行。我认为您遇到了IDLE的解释器的局限性,它往往对基于multiprocessingthreading的代码都有问题。我只建议您不要尝试在空闲时间运行代码。

相关文章