Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python线程问题,原始输入()阻塞线程,失控线程_Python_Python 2.7_Python Multithreading - Fatal编程技术网

Python线程问题,原始输入()阻塞线程,失控线程

Python线程问题,原始输入()阻塞线程,失控线程,python,python-2.7,python-multithreading,Python,Python 2.7,Python Multithreading,我在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):

我在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 ================================
>
从现在开始
垃圾邮件,垃圾邮件,垃圾邮件
**几秒钟后,用户点击回车键**
回溯(最近一次呼叫最后一次):
文件“C:\File\test.py”,第37行,在
a、 停止()
文件“C:\File\test.py”,第28行,在stop中
self.task.cancel()
AttributeError:“踏步测试”对象没有属性“任务”
>>>垃圾邮件,垃圾邮件,垃圾邮件
垃圾邮件,垃圾邮件,垃圾邮件
垃圾邮件,垃圾邮件,垃圾邮件
垃圾邮件,垃圾邮件,垃圾邮件
垃圾邮件,垃圾邮件,垃圾邮件
垃圾邮件,垃圾邮件,垃圾邮件
垃圾邮件,垃圾邮件,垃圾邮件
=================================================重新启动================================
在我重新启动终端之前,它一直打印出来。当我将raw_input()命令替换为threading.sleep()以暂停一段时间时,它会按预期工作。在我看来,raw_input()以某种方式阻止了foo()中计时器的执行

为什么这不能像我预期的那样工作?是因为某种原因,它应该像这样工作,还是我遗漏了什么


任何帮助都将不胜感激。谢谢

您的代码看起来不错,在Linux和Windows上都适用于我。我认为您遇到了IDLE解释器的局限性,它往往在基于
的多处理
线程
的代码方面都存在问题。我只是建议不要尝试在空闲状态下运行代码。

Hmm,它在Windows和Linux上都可以正常工作。你想在什么环境下运行脚本?在Windows7上的Python2.7IdleShell下,我在Windows的标准PythonShell中尝试了它,它的工作原理与预期的一样。这个bug似乎是特定于IDLE的。