python - 如何在线程之后继续代码?对这段代码的流程感到困惑
问题描述
抱歉,我是编程新手,不太了解 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 包含代码中未缩进的所有内容。它启动一个线程,然后等待用户输入,然后打印“检查点”。然后就完成了。
线程 2 由函数组成,check.
它检查变量是否不是 None。如果发生这种情况,它就完成了。如果这在三秒钟内没有发生,它会打印“太慢”,现在它已经完成了。
两个线程都不“知道”另一个线程在做什么,除非它们共享一个变量,answer.
当所有线程完成时,整个程序将退出。
而已。这就是你写的。因此,如果您键入某些内容,程序就会退出,因为线程 1 将始终在您键入内容后退出。线程 2 一旦看到变量不是 None 就退出。
如果您不输入任何内容,线程 1 将永远坐在那里等您。这就是输入函数的工作原理。线程 2 将在 3 秒或更短时间内退出,但这不会影响线程 1。
您不能从一个线程向另一个线程抛出异常。所以你不能从线程 2 抛出异常并让线程 1 处理它。
您是否尝试在出现“太慢”的消息后输入一些内容?当您这样做时,线程 1(以及您的程序)将退出。
底线是在这种情况下您不能使用输入函数,因为该函数会阻塞其线程的流程,直到用户键入某些内容。没有任何其他线程可以使其继续。
推荐阅读
- gitlab - 在 Gitlab CI 中,你能从触发的作业中“拉”出工件吗?
- java - 摆脱 java.lang.OutOfMemoryError:Java 中递归函数中的 Java 堆空间错误
- python - 如何按相邻值分割矩阵?
- sql-server - SQL Server:选择同一列中具有相同值的 2 行的最大日期/时间
- objective-c - 退出 if 语句时内存中的指针发生了变化
- android - Ionic App.component.html 会话未显示
- javascript - 如何检查 .class 中的第一类成员并使用悬停
- java - Java 内置库中的两个链接如何链接在一起?
- c++ - 如何在 std::unordered_map 中维护 std:: 队列而不丢失对队列所做的更改?
- flutter - 颤振返回多个小部件卡住