网站地图

bb电子自动软件

~typenameen~

在 Python 中接受键盘停止信号

作者:admin发布时间:2021-06-21 04:30

bb电子自动软件在 Python 中接收键盘停止信号

假定有如许一个需要,你需求从 Redis 中继续不休读取数据,并把这些数据写入到 MongoDB 中。你能够会如许写代码:

但如许写有一个题目,就是每来一条数据都要连贯一次 MongoDB,大量工夫虚耗在了收集 I/O上。

因而大师会把代码改为下面如许:

每凑够1000条数据,批量写入到 Mongobb电子自动软件DB 中。

目前又面对此外一个题目。假定由于某种原因,我需求更新这个顺序,因而我按下了键盘上的Ctrl +C强迫封闭了这个顺序。而此时to_be_insert列表内里有999条数据将会永世遗失——它们曾经被从 Redis 中删除了,但又没有来得及写入 Mbb电子自动软件ongoDB中。

我想实现,当我按下 Ctrlbb电子自动软件 + C 时,法式再也不从 Redis 中读取数据,但会先把to_be_insert中的数据(不管有几条)都插入 MongoDB中。末了再关闭程序。

要实现这个需要,就必需在咱们按下Ctrl + C时,顺序还能接续运转一段代码。可题目是按下Ctrl +C时,步伐就直接完毕了,怎样还能再运转一段代码?

实际上,当咱们按下键盘上的Ctrl + C时,Python 收到一个名为SIGINT的信号。详细法则能够浏览制作方文档。收到信号今后,Python会挪用一个信号回调函数。只不过默许的回调函数就是让法式抛出一个 KeyboardInterrupt非常致使顺序封闭。如今,咱们能够想法让 Python利用咱们自定义的一段函数来作为信号回调函数。

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

以是咱们点窜一下上面的代码:

咱们界说了一个全局变量stop,默许为 False,以是默许情形下,while not stop地点的轮回领会继续运转。

咱们界说了一个函数keyboard_handler,它的作用是修正全局变量stop为True。必要留意的是,在函数内里点窜全局变量,必需先应用global 变量名声明这个变量为全局变量。不然没法修正。

点窜今后,while not stop轮回中断,因而顺序进入:

只要列表内里有数据,就会批量插入 MongoDB 中。而后顺序bb电子自动软件竣事。

整段代码的关键就在signal.bb电子自动软件signal(signal.SIGINT,keyboard_handler)这里把信号SIGINT与函数keyboard_handler联系上了,因而,在上面这段代码运行的任何时间,只要按下键盘的Ctrl+C,顺序就会进入keyboard_handler函数内里,优先履行这个函数内里的代码。实行完成今后,回到以前间断的处所,继续执行以前没有完成的代码。而因为在函数内里我曾经修正了stop的值,以是本来的轮回不能继续执行,因而进入末了的扫尾事情。

须要细致的是,要是你的全部代码全都是应用 Python 写的,那末 signal能够在你顺序的任何阶段触发,只要你按下 Ctrl +C,立即就会进入配置好的信号回调函数中。

但假如你的代码中,有一部分代码是应用 C 说话写的,那末当你按下Ctrl + C今后,能够须要等这段C语言的代码运行完成之后,才会进入你配置的信号回调函数中。

【编辑bb电子自动软件举荐】