Python 命令行非阻塞输入的小例子

yizhihongxing

这里是 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技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 如何利用python多线程爬取天气网站图片并保存

    如何利用Python多线程爬取天气网站图片并保存 在Python中,可以使用多线程技术提高爬取效率。以下是一个示例,介绍了如何利用Python多线程爬取天气网站图片并保存。 示例:利用Python多线程爬取天气网站图片并保存 以下是一个示例,可以利用Python多线程爬取天气网站图片并保存: import requests from bs4 import B…

    python 2023年5月15日
    00
  • 使用Gitee自动化部署python脚本的详细过程

    下面我将详细讲解使用Gitee自动化部署Python脚本的详细过程。 1. 首先,在Gitee上创建仓库并配置SSH key 1.1 在Gitee上创建一个仓库,将需要自动化部署的Python脚本上传至该仓库中。 1.2 在本地生成SSH key,并将公钥部分添加至Gitee的SSH key中,以便在后续操作中使用SSH协议上传代码,并且不用每次操作都输入用…

    python 2023年5月19日
    00
  • python实现大文件分割与合并

    接下来我将会详细讲解Python实现大文件分割与合并的完整攻略,同时给出两个示例说明。 1. 大文件分割 1.1 背景 在日常工作中,有时候我们会遇到需要将大文件分割成若干个小文件的情况,以便于上传、备份、压缩等操作。Python作为一门强大的编程语言,可以方便地实现大文件的分割。 1.2 实现步骤 确定文件路径及分割大小(单位为MB): import os…

    python 2023年5月19日
    00
  • python连接打印机实现打印文档、图片、pdf文件等功能

    下面我将为您讲解如何使用 Python 连接打印机,实现打印文档、图片、pdf 文件等功能的完整攻略。整个过程包含以下几个步骤: 确定打印机类型 安装打印机驱动程序 安装 Python 插件 编写 Python 程序 执行 Python 程序 下面我将一步一步为您详细讲解如何实现每一步。 1. 确定打印机类型 首先需要确定使用的打印机类型。对于本地打印机,可…

    python 2023年5月23日
    00
  • 在Python中使用NumPy返回切比雪夫级数系数的一维数组的缩放伴矩阵

    获取切比雪夫级数系数的一维数组可以使用NumPy库中的chebyt函数,生成缩放伴随矩阵可以使用NumPy库中的companion函数。下面是详细的步骤: 导入NumPy库 在代码文件开头执行以下导入语句: import numpy as np 获取切比雪夫级数系数的一维数组 使用NumPy的chebyt函数,可以获取n阶切比雪夫级数的系数,如下所示: n …

    python-answer 2023年3月25日
    00
  • python实现银联支付和支付宝支付接入

    Python实现银联支付和支付宝支付接入攻略 简介 本攻略介绍使用Python实现银联支付和支付宝支付接入的具体步骤和示例代码。Python是一种高级编程语言,编写Python程序可以快速实现各种业务需求。 银联支付接入 步骤 银联支付接入的具体步骤如下: 1. 开通银联商户账号 开通银联商户账号可通过银联官网申请,获取商户号、私钥和公钥等重要配置信息。 2…

    python 2023年6月3日
    00
  • 将NumPy数组转换为带头文件的Pandas数据框架

    将NumPy数组转换为带头文件的Pandas数据框架可以使用 Pandas 库中的 DataFrame 构造函数。DataFrame 是一个二维的数据结构,每列可能拥有不同的数据类型。 具体步骤如下: 步骤一:导入库 import pandas as pd import numpy as np 步骤二:创建NumPy数组 np_arr = np.array(…

    python-answer 2023年3月25日
    00
  • python中的tkinter库弹窗messagebox详解

    Python中的tkinter库弹窗 messagebox详解 1. 概述 tkinter是Python中常用的GUI库,它提供了常见的组件,如按钮、标签、文本框等等。而messagebox就是其中一个常用的弹窗组件。 在Python中,要使用messagebox组件,需要先从tkinter库导入它: from tkinter import messageb…

    python 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部