python - 如何在线程后继续代码?对这段代码的流程感到困惑

标签 python linux multithreading exception nonblocking

抱歉,我是编程新手,并不真正理解 Thread 这个东西是如何工作的。我的目标是为这个输入计时,我找到了一些代码来做到这一点。但是,我对该线程的结构感到困惑,因为如果您“太慢”,程序将永远不会继续按需要打印“检查点”。它只是有点……卡住……为什么卡住了?

import time
from threading import Thread

answer = None

def check():
    # waits for user input for 3 seconds
    for i in range(3):
        time.sleep(1)
        if answer != None:
            return
    print('too slow')

Thread(target = check).start()

answer = input("Input something: ")

print('checkpoint')

我试过的一件事是:

t = Thread(target = check)
t.start()
answer = input("Input something: ")
# also tried t.join()
if t.is_alive:
    print('hi')

我试图通过引发和捕获异常来解决这个程序。但是,我无法捕获异常。我怎么捕获它? (或者我遇到的问题还有其他解决方案吗?)

import time
from threading import Thread

answer = None

def check():
    # waits for user input for 3 seconds
    for i in range(3):
        time.sleep(1)
        if answer != None:
            return
    print('too slow')
    # was hoping to catch this as an exception
    raise TimeoutError

# starts new thread
Thread(target = check).start()

# prompts user for an input
answer = input("Input something: ")

print('checkpoint')

有什么好处: 当您在 3 秒内在输入提示中键入内容时,它会打印“检查点”并继续执行代码。

坏处: 如果你花的时间“太长”,程序会打印出“太慢了!”正如预期的那样,但随后它停止执行代码,只是有点……卡住。因此,为了尝试解决此问题,我希望引发超时错误然后捕获它,但我不知道如何捕获它。这没有发现错误:

try:
    Thread(target = check).start()
except:
    pass

这也不是:

try:
    answer = input("Input something: ")
except:
    pass

我能得到一些帮助吗?谢谢!

编辑:忘了说我使用的是 Linux,所以我的应用程序的很多解决方案都不适合我,比如 msvcrt 或键盘。并且适用于 Linux 的模块似乎不是“非阻塞的”。

最佳答案

您应该将这两个线程视为两个独立的程序,但共享相同的变量。

线程 1 包含代码中未缩进的所有内容。它启动一个线程,然后等待用户输入,然后打印“checkpoint”。然后就完成了。

线程 2 包含函数 check。 它检查变量是否为 None。如果发生这种情况,它就完成了。如果这在三秒钟内没有发生,它会打印“太慢”,现在就完成了。

两个线程都“不知道”另一个线程在做什么,除了它们共享一个变量,answer.

当所有线程完成时,整个程序将退出。

就是这样。那就是你写的。因此,如果您键入内容,程序将退出,因为线程 1 将始终在您键入内容后退出。线程 2 在发现变量不是 None 时退出。

如果您不输入任何内容,线程 1 将永远坐在那里等待您。这就是输入函数的工作原理。线程 2 将在 3 秒或更短时间后退出,但这不会影响线程 1。

您不能从一个线程向另一个线程抛出异常。因此,您不能从线程 2 抛出异常并让线程 1 处理它。

您是否尝试过在“太慢”消息出现后键入内容?当您这样做时,线程 1(以及您的程序)将退出。

最重要的是,在这种情况下您不能使用输入函数,因为该函数会阻塞其线程流,直到用户键入内容。任何其他线程都无法使其继续。

关于python - 如何在线程后继续代码?对这段代码的流程感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56879527/

相关文章:

python - 从大型语料库创建 DTM

python - 为什么 Python SDK 不从 Azure 机器学习返回数据集?

android - 服务和处理程序之间的关系

python - Django 静态内联

python - 值错误 : need more than 2 values to unpack in Python 2. 6.6

linux - 如何使用 bash 脚本或 awk 打印 csv 文件中的单个单元格

linux - 如何为 RISC-V 编译 Linux Kernel 4.20

php - Apache - 浏览任何域 URL 都指向同一文件夹

java - NIO线程CPU使用率

java - 多级锁会导致多线程程序死锁吗?