返回顶部
首页 > 资讯 > 后端开发 > Python >Python 中怎么接管键盘中断信号
  • 200
分享到

Python 中怎么接管键盘中断信号

2023-06-16 16:06:54 200人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

python 中怎么接管键盘中断信号,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。假设有这样一个需求,你需要从 Redis 中持续不断读取数据,并把这些数据写入到 MongoD

python 中怎么接管键盘中断信号,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

假设有这样一个需求,你需要从 Redis 中持续不断读取数据,并把这些数据写入到 MongoDB 中。你可能会这样写代码:

import JSON import Redis import pymonGo   client = redis.Redis() handler = pymongo.MongoClient().example.col   while True:     data_raw = client.blpop('data', timeout=300)     if not data_raw:         continue     data = json.loads(data_raw[1].decode())     handler.insert_one(data)

但这样写有一个问题,就是每来一条数据都要连接一次 mongoDB,大量时间浪费在了网络 I/O上。

于是大家会把代码改成下面这样:

import json import redis import pymongo   client = redis.Redis() handler = pymongo.MongoClient().example.col   to_be_insert = [] while True:     data_raw = client.blpop('data', timeout=300)     if not data_raw:         continue     data = json.loads(data_raw[1].decode())     to_be_insert.append(data)     if len(to_be_insert) >= 1000:         handler.insert_many(to_be_insert)         to_be_insert = []

每凑够1000条数据,批量写入到 MongoDB 中。

现在又面临另外一个问题。假设因为某种原因,我需要更新这个程序,于是我按下了键盘上的Ctrl +  C强制关闭了这个程序。而此时to_be_insert列表里面有999条数据将会永久丢失——它们已经被从 Redis 中删除了,但又没有来得及写入 MongoDB  中。

我想实现,当我按下 Ctrl + C 时,程序不再从 Redis 中读取数据,但会先把to_be_insert中的数据(无论有几条)都插入 MongoDB  中。最后再关闭程序。

要实现这个需求,就必须在我们按下Ctrl + C时,程序还能继续运行一段代码。可问题是按下Ctrl +  C时,程序就直接结束了,如何还能再运行一段代码?

实际上,当我们按下键盘上的Ctrl + C时,Python 收到一个名为SIGINT的信号。具体规则可以阅读官方文档。收到信号以后,Python  会调用一个信号回调函数。只不过默认的回调函数就是让程序抛出一个 KeyboardInterrupt异常导致程序关闭。现在,我们可以设法让 Python  使用我们自定义的一段函数来作为信号回调函数。

要使用信号,我们需用导入 Python 的signal库。然后自定义一个信号回调函数,当 Python 收到某个信号时,调用这个函数。

所以我们修改一下上面的代码:

import signal import json import redis import pymongo   client = redis.Redis() handler = pymongo.MongoClient().example.col stop = False   def keyboard_handler(signum, frame):     global stop     stop = True   signal.signal(signal.SIGINT, keyboard_handler)  to_be_insert = [] while not stop:     data_raw = client.blpop('data', timeout=300)     if not data_raw:         continue     data = json.loads(data_raw[1].decode())     to_be_insert.append(data)     if len(to_be_insert) >= 1000:         handler.insert_many(to_be_insert)         to_be_insert = []  if to_be_insert:     handler.insert_many(to_be_insert)

我们定义了一个全局变量stop,默认为 False,所以默认情况下,while not stop所在的循环体会持续运行。

我们定义了一个函数keyboard_handler,它的作用是修改全局变量stop为  True。需要注意的是,在函数里面修改全局变量,必须先使用global 变量名声明这个变量为全局变量。否则无法修改。

修改以后,while not stop循环停止,于是程序进入:

if to_be_insert:     handler.insert_many(to_be_insert)

只要列表里面有数据,就会批量插入 MongoDB 中。然后程序结束。

整段代码的关键就在signal.signal(signal.SIGINT,  keyboard_handler)这里把信号SIGINT与函数keyboard_handler关联上了,于是,在上面这段代码运行的任何时候,只要按下键盘的Ctrl  +  C,程序就会进入keyboard_handler函数里面,优先执行这个函数里面的代码。执行完成以后,回到之前中断的地方,继续执行之前没有完成的代码。而由于在函数里面我已经修改了stop的值,所以原来的循环不能继续执行,于是进入最后的收尾工作。

需要注意的是,如果你的整个代码全都是使用 Python 写的,那么 signal可以在你程序的任何阶段触发,只要你按下 Ctrl +  C,立刻就会进入设置好的信号回调函数中。

看完上述内容,你们掌握Python 中怎么接管键盘中断信号的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网Python频道,感谢各位的阅读!

--结束END--

本文标题: Python 中怎么接管键盘中断信号

本文链接: https://lsjlt.com/news/284215.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python 中怎么接管键盘中断信号
    Python 中怎么接管键盘中断信号,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。假设有这样一个需求,你需要从 Redis 中持续不断读取数据,并把这些数据写入到 MongoD...
    99+
    2023-06-16
  • Python键盘中断信号如何接管
    这篇文章主要介绍了Python键盘中断信号如何接管的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python键盘中断信号如何接管文章都会有所收获,下面我们一起来看看吧。假设有这样一个需求,你需要从 Redis ...
    99+
    2023-06-30
  • 怎么在python中中对信号进行处理
    今天就跟大家聊聊有关怎么在python中中对信号进行处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。python可以做什么Python是一种编程语言,内置了许多有效的工具,Pyth...
    99+
    2023-06-14
  • 怎么在ubuntu中将键盘布局改成美式键盘
    本篇文章给大家分享的是有关怎么在ubuntu中将键盘布局改成美式键盘,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在桌面上右键,打开open terminal,输入命令。只要输...
    99+
    2023-06-13
  • swoole中信号量怎么使用
    这篇文章主要介绍了swoole中信号量怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇swoole中信号量怎么使用文章都会有所收获,下面我们一起来看看吧。在swoole中,信号量主要用来保护共享资源,使得...
    99+
    2023-06-29
  • 怎么在python中中断Break语句
    这期内容当中小编将会给大家带来有关怎么在python中中断Break语句,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,P...
    99+
    2023-06-14
  • VB.NET中怎么获取硬盘信息
    VB.NET中怎么获取硬盘信息,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。VB.NET获取硬盘信息1、用API函数GetDiskFreeSpaceEx获取磁盘空间Privat...
    99+
    2023-06-17
  • 怎么在Linux中使用屏幕键盘
    这篇文章主要介绍了怎么在Linux中使用屏幕键盘的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么在Linux中使用屏幕键盘文章都会有所收获,下面我们一起来看看吧。屏幕键盘可以替代物理键盘输入。在某些情况下,屏...
    99+
    2023-06-28
  • Android中怎么监听软键盘状态
    本篇文章为大家展示了Android中怎么监听软键盘状态,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android 监听软键盘状态的实例详解activityRoot是activity的根view,就...
    99+
    2023-05-30
    android
  • 微信通话中断是怎么回事
    微信通话中断是网络问题、设备问题、与其他应用程序冲突和微信服务器问题有关引起的。1、网络问题,当网络信号弱或者断开时,微信通话可能会自动中断;2、设备问题,手机系统或者微信应用程序版本过旧,也可能会出现通话中断的情况;3、与其他应用程序冲突...
    99+
    2023-08-14
  • IDEA中怎么设置和管理断点
    在IDEA中设置和管理断点可以帮助开发者更有效地调试代码。以下是在IDEA中设置和管理断点的步骤: 在代码编辑器中找到想要设置断点...
    99+
    2024-04-03
    IDEA
  • linux中怎么使用&号和管道符号
    这篇文章将为大家详细讲解有关linux中怎么使用&号和管道符号,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。掌握连接各个命令之间的连接符号用法也是很重要的。实际上,命令的用法并不难,例如 mkdi...
    99+
    2023-06-27
  • java中怎么用instanceof判断接口
    在Java中,可以使用`instanceof`关键字来判断一个对象是否实现了某个接口。下面是一个示例: interface MyIn...
    99+
    2023-10-26
    java
  • VB.NET中怎么获取硬盘序列号
    本篇文章给大家分享的是有关VB.NET中怎么获取硬盘序列号,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。VB.NET中有一个特点就是对移动设备的操作。运用这一语言可以对这些设备...
    99+
    2023-06-17
  • python中Queue怎么通信
    这篇文章主要介绍了python中Queue怎么通信,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,...
    99+
    2023-06-14
  • Linux中怎么实现管道通信
    Linux中怎么实现管道通信,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、定义管道是单向的、先进先出的。它将一个程序的输入和另一个程序的输出连接起来。数据被...
    99+
    2023-06-13
  • WinForm中怎么处理键盘输入事件
    在WinForm中处理键盘输入事件可以通过重写Form类的Key事件来实现。以下是处理键盘输入事件的步骤: 打开你的WinFor...
    99+
    2024-04-08
    winform
  • 怎么在python中判断变量
    这期内容当中小编将会给大家带来有关怎么在python中判断变量,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫...
    99+
    2023-06-14
  • Linux中怎么移除符号连接
    这篇文章主要介绍了Linux中怎么移除符号连接的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux中怎么移除符号连接文章都会有所收获,下面我们一起来看看吧。什么是符号链接?符号链接(symlink)又称软链...
    99+
    2023-06-27
  • 怎么在python中使用pynput库对鼠标、键盘进行监控
    这篇文章将为大家详细讲解有关怎么在python中使用pynput库对鼠标、键盘进行监控,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python是什么意思Python是一种跨平台的、具有解释...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作