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

2024-02-28

我在 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() 中的计时器执行。

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

任何帮助,将不胜感激。谢谢!


你的代码看起来不错,并且在 Linux 和 Windows 上都适用。我认为你遇到了 IDLE 解释器的限制,这往往会出现问题multiprocessing and threading基于代码。我只是建议不要尝试从 IDLE 中运行代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python线程问题,raw_input()阻塞线程,线程失控 的相关文章

随机推荐