这里是 Python 命令行非阻塞输入的小例子的完整攻略。
什么是命令行的阻塞输入
在命令行下运行 Python 时,我们通常使用 input()
函数从标准输入中读取数据。input()
会阻塞程序的执行,直到用户输入了数据并按下了回车键。
这种阻塞输入的方式有利有弊。它简单易用,不需要复杂的异步编程技巧。但是它会让程序在读取输入等待用户的响应时,不能执行其他的任务。
如何实现命令行的非阻塞输入
为了让程序可以在读取输入时继续执行其他任务,我们可以使用 Python 的 select
模块中的 select()
函数来实现 非阻塞 I/O。
在使用 select()
函数的时候,我们可以让 Python 监视多个文件描述符(包括标准输入)的可读性和可写性。当标准输入有数据可以读取时,我们就可以立即读取数据并继续执行其他的任务。下面是一个使用 select()
函数实现非阻塞输入的例子。
import select
import sys
print("Please input something:")
while True:
r, _, _ = select.select([sys.stdin], [], [], 1.0) # 1 秒超时
if r:
data = sys.stdin.readline().strip() # 读取一行输入
print("You input:", data)
else:
print("Timeout!")
在上面的例子中,我们使用了 select.select()
函数来监听标准输入是否有数据可以读取,第一个参数是一个列表,包含要监听的文件描述符,这里只监听了标准输入。select.select()
函数会在第四个参数指定的秒数内超时返回,如果监听的文件描述符有可读事件,select.select()
会返回一个三元组,包含可读、可写和异常三个列表。如果标准输入中有数据可以读取,程序就会读取输入并输出。如果超时,程序则会打印超时信息。
第二个示例说明
为了更好地展示非阻塞输入的特点,我们可以使用一个多线程的示例:在一个线程中循环输出数字,同时在另一个线程中监听标准输入。当监听线程收到 "stop" 的输入时,就会停止输出。
import threading
import select
import sys
def print_number():
for i in range(10):
print(i)
time.sleep(1)
def read_input():
while True:
r, _, _ = select.select([sys.stdin], [], [], 1.0)
if r:
data = sys.stdin.readline().strip()
if data == "stop":
print("Stopped!")
break
if __name__ == '__main__':
t1 = threading.Thread(target=print_number)
t2 = threading.Thread(target=read_input)
t1.start()
t2.start()
t1.join()
t2.join()
在上面的例子中,我们创建了两个线程,一个线程输出数字,另一个线程监听标准输入。当用户输入 "stop" 时,监听线程就会发出停止信号,并输出 "Stopped!"。这个例子展示了如何使用非阻塞输入来实现多任务的同时执行,使得一个线程不会因为阻塞等待用户输入而导致整个程序的阻塞。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 命令行非阻塞输入的小例子 - Python技术站