当前位置: 首页 > 面试题库 >

在固定时间内接收多个输入

韦宣
2023-03-14
问题内容

我使用的是Python 3,我想编写一个程序,在一定时间内要求多个用户输入。这是我的尝试:

from threading import Timer
##
def timeup():
    global your_time
    your_time = False
    return your_time
##
timeout = 5
your_Time = True
t = Timer(timeout, timeup)
t.start()
##
while your_time == True:
    input()
t.cancel()
print('Stop typing!')

问题是,即使时间到了,代码仍然等待输入。我希望循环在时间用完时停止。我该怎么做呢?谢谢!


问题答案:

此解决方案与 平台无关, 并且会 立即
中断键入以告知有关现有超时的信息。不必等到用户按下ENTER键就可以发现发生了超时。除了及时通知用户之外,这还可以确保在进一步处理超时后不再输入任何内容。

特征

  • 平台无关(Unix / Windows)。
  • 仅StdLib,无外部依赖项。
  • 仅线程,无子进程。
  • 超时立即中断。
  • 超时时清除提示器的关闭。
  • 在时间跨度内可以无限输入。
  • 易于扩展的PromptManager类。
  • 程序可能会在超时后恢复,可能会在不重新启动程序的情况下多次运行提示实例。

此答案使用线程管理器实例,该实例在单独的提示线程和MainThread之间进行中介。管理器线程检查超时,并将输入从提示线程转发到父线程。通过这种设计,可以轻松修改MainThread,使其无需阻塞(进行更改_poll以替换阻塞queue.get())。

在超时时,管理器线程要求ENTER继续,并使用一个
threading.Event实例来确保提示线程在继续之前关闭。在特定方法的文档文本中查看更多详细信息:

from threading import Thread, Event
from queue import Queue, Empty
import time


SENTINEL = object()


class PromptManager(Thread):

    def __init__(self, timeout):
        super().__init__()
        self.timeout = timeout
        self._in_queue = Queue()
        self._out_queue = Queue()
        self.prompter = Thread(target=self._prompter, daemon=True)
        self.start_time = None
        self._prompter_exit = Event()  # synchronization for shutdown
        self._echoed = Event()  # synchronization for terminal output

    def run(self):
        """Run in worker-thread. Start prompt-thread, fetch passed
        inputs from in_queue and check for timeout. Forward inputs for
        `_poll` in parent. If timeout occurs, enqueue SENTINEL to
        break the for-loop in `_poll()`.
        """
        self.start_time = time.time()
        self.prompter.start()

        while self.time_left > 0:
            try:
                txt = self._in_queue.get(timeout=self.time_left)
            except Empty:
                self._out_queue.put(SENTINEL)
            else:
                self._out_queue.put(txt)
        print("\nTime is out! Press ENTER to continue.")
        self._prompter_exit.wait()

    @property
    def time_left(self):
        return self.timeout - (time.time() - self.start_time)

    def start(self):
        """Start manager-thread."""
        super().start()
        self._poll()

    def _prompter(self):
        """Prompting target function for execution in prompter-thread."""
        while self.time_left > 0:
            self._in_queue.put(input('>$ '))
            self._echoed.wait()  # prevent intermixed display
            self._echoed.clear()

        self._prompter_exit.set()

    def _poll(self):
        """Get forwarded inputs from the manager-thread executing `run()`
        and process them in the parent-thread.
        """
        for msg in iter(self._out_queue.get, SENTINEL):
            print(f'you typed: {msg}')
            self._echoed.set()
        # finalize
        self._echoed.set()
        self._prompter_exit.wait()
        self.join()


if __name__ == '__main__':

    pm = PromptManager(timeout=5)
    pm.start()

示例输出:

>$ Hello
you typed: Hello
>$ Wor
Time is out! Press ENTER to continue.

Process finished with exit code 0

请注意,在尝试键入“世界”时,此处会弹出超时消息。



 类似资料:
  • 问题内容: 我正在编写一个测试系统,我要做的就是计算用户在此问题上花费了多少秒。即我打印问题(标准System.out.println),然后等待5秒钟,如果用户在这5秒钟内(通过标准输入)回答了此问题,我想保留此值。 如果用户在5秒钟内未提供答案,则必须跳过此问题并继续。 问题是我正在通过对象读取用户答案,我想这是不可控制的。 我怎么解决这个问题?这是没有该功能的代码片段,您能给我一些提示添加什

  • 本文向大家介绍Android自定义View接收输入法输入的内容,包括了Android自定义View接收输入法输入的内容的使用技巧和注意事项,需要的朋友参考一下 前言 可能对于很多新人来讲,看到这个题目,想到的能接收输入法输入的内容大概只有EditText和TextView这两个控件了,其实不然,只要是View的子类,都可以接收输入法输入的内容。 现在我们一步一步来实现,第一步我们得有一个View的

  • 问题内容: 好的,我注意到了一些东西,但是在CSS规范中找不到。样式化元素将相对于浏览器视口绝对定位。如果将固定位置的元素放置在另一个元素内会怎样?CSS示例如下: 和HTML: 据我所知,该元素相对于其最近的父元素也是固定位置的。这在所有浏览器中都可以使用吗?另外,它是错误还是故意行为? 到目前为止,我在互联网上没有找到关于此主题的任何内容,只是“固定位置使其固定在页面上”。 问题答案: 固定和

  • 问题内容: 我正在尝试用Java创建一个简单的Pong游戏,但我不知道如何让两个玩家同时使用键盘。游戏尚不完整,我目前正在为两位玩家进行划桨动作。问题是,当一个玩家按下自己的向上键并向上移动其拨片时,但是如果其他玩家按下其任意键,则会取消先前的玩家动作并导致拨片停止。我想我需要一种同时处理多个键输入的方法。这是我的代码,底部的KeyListeners是我需要帮助的地方。我只有1年的Java程序员,

  • 我要求将特定分区的所有行收集到DataFrame中的单个行中。我必须将此数据frame转储到cosmosDB中,每个文档只能容纳2MB的数据。但是当我将上面的数据集收集到一行中时,它超过了2MB,并且在写入CosmosDB时抛出了错误。 我想把行收集成一个固定的500行间隔。对于一个分区,前500行应该被收集到一行中,后500行应该被收集到另一行中,依此类推。 输入数据如下所示。 我尝试了如下所示

  • 问题内容: Google Guava具有CacheBuilder,它允许使用到期密钥创建ConcurrentHash,从而允许在固定的平局之后删除条目。但是,我只需要缓存一个特定类型的实例。 使用Google Guava在固定的超时时间内缓存单个对象的最佳方法是什么? 问题答案: 我会用番石榴的Suppliers.memoizeWithExpiration(供应商委托,持续时间长,TimeUnit