【问题标题】:Do something while user input not received在未收到用户输入时做某事
【发布时间】:2014-10-10 20:47:19
【问题描述】:

在 Python 中,当用户没有输入时,我可以通过什么方式循环执行某些操作。 我有 python 客户端,我要求用户输入,但是当用户没有输入时,我想继续每五秒更新一次。

我不能用

 while (raw_input==""):
      update()

因为如果输入是“”,则表示用户已经输入了一些东西(回车);

有办法吗?

更新:

我仍然无法为我工作。我尝试了下面的方法,也尝试了类似于此线程的方法:waiting for user input in separate thread。而且我还尝试将 update() 方法传递给应该在后台工作的线程。但是任何带有 raw_input() 的东西都会让它一直等待输入:

 import threading
 import time

def update():
   while True:
      time.sleep(5)
      print "update"+'\n'

mythread = threading.Thread(target=update, args=())
mythread.daemon = True
mythread.start()

while True:
   usrin=raw_input()
   print "you typed: "+usrin

每次用户输入内容时,都会完成更新,然后返回 usrin。如果这是我想要的,我可以轻松地将 update() 放入最后一个 while 循环中。

如果我只是用 update 方法启动这个线程,并且在程序中什么都不做(废弃最后一个 while 循环),那么在 shell 中,当它每五秒更新一次时,我仍然可以使用 shell(即键入 3+5它给了我8)。我希望在程序中发生类似的事情,当用户处于非活动更新状态时,如果他键入响应并返回更新。

注意:另外,我目前使用的是 python 2.7.8,切换版本会有帮助吗?

【问题讨论】:

标签: python loops input


【解决方案1】:

也许这可以让你开始:

from threading import Thread
from time import sleep

result = None

def update_every_second():
    while result is None:
        sleep(1)
        print "update"

t = Thread(target=update_every_second)
t.start()
result = raw_input('? ')

print "The user typed", result

【讨论】:

  • 一般来说,线程之间共享的资源(如数据)应该使用某种机制来防止同时访问。
  • @martineau 在这种情况下 GIL 还不够吗?
  • 首先,GIL (Global Interpreter Lock) 可以防止多个线程同时运行,它是一个 C Python 实现细节,并非所有 Python 都有。另外,我的理解是它是在 I/0 上发布的。即使是从不进行任何 I/O 的受 CPU 限制的线程也会每隔一段时间释放并重新获取 GIL,从而为其他线程提供运行机会。
  • @martineau 我不确定你的意思是什么。上例中唯一的共享资源是名称result的绑定:被主线程反弹,被其他线程读取。一个阅读器、一个编写器和一个编写器在 any Python 实现上执行应该是原子操作(一个重新绑定)。读者执行在 G 中找到的 LGB 查找。鉴于 LGB 的 L 部分在编译时解析,该查找可能(有效)在任何实现上也是原子的。您将如何提高上述代码示例的线程安全性?你需要吗?
  • 简单地说,result 处于不确定状态,而 raw_input() 正在从输入中读取一行,等待换行符,同时累积读入字符串的字符——所以你不想要另一个线程同时检查其值。顺便说一句,它通常被称为LEGB 范围规则。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 2020-12-24
  • 2011-09-13
  • 2023-03-31
相关资源
最近更新 更多