按 Ctrl+C 后,如何让 Python 在程序停止之前完成作业?

2023-12-29

我有 4 个这样的工作的无限循环:

list1 = []
while 1:
    try:
        # job1
        a = B()
        # job2
        c = a.accd()
        # job3
        d = len(c)
        # job4
        list1.append(d)
    except KeyboardInterrupt:
        # save list1 into database(took long time)
        break

按 Ctrl + C 后,我无法确保它完成所有 4 项工作然后停止。

这似乎在睡眠时有效,但它有睡眠延迟。

list1 = []
while 1:
    try:
        # job1
        a = B()
        # job2
        c = a.accd()
        # job3
        d = len(c)
        # job4
        list1.append(d)
    except aaddcdcd:
        # some code here
    finally:
        try:
            time.sleep(3) # if I press Ctrl + C here it works perfectly
        except: KeyboardInterrupt:
            # save list1 into database(took long time)
            break

是否有可能在任何时候,当我按下某个键时,它都会执行此循环中的所有作业,更新数据库,然后停止。


好的,我有两个答案给你。

第一个答案

def jobOne():
    pass
def jobTwo():
    pass
def jobThree():
    pass
def jobFour():
    pass

interrupted    = False
finished       = False
jobs           = [jobOne, jobTwo, jobThree, jobFour]
jobsCarriedOut = [0] * len(jobs)
currentJob     = 0

while (not finished or not interrupted):
    try:
        jobs[currentJob]()
        jobsCarriedOut[currentJob] += 1

        currentJob += 1

        if currentJob == len(jobs):
            currentJob, finished = 0, True
        else:
            finished = False
    except KeyboardInterrupt:
        interrupted = True

print(jobsCarriedOut)

该作品将退出一次KeyboardInterrupt已被触发并且所有作业均已完成。

第二个答案

我只是简单地用谷歌搜索了一下禁用键盘中断Python并发现了这个如何覆盖键盘中断? (Python) https://stackoverflow.com/a/6990487/4180176并提出了这个略有不同的代码。

import signal

def signal_handler(signal, frame):
    global interrupted
    interrupted = True

def jobOne():
    pass
def jobTwo():
    pass
def jobThree():
    pass
def jobFour():
    pass

interrupted    = False
finished       = False
jobs           = [jobOne, jobTwo, jobThree, jobFour]
jobsCarriedOut = [0] * len(jobs)
currentJob     = 0

signal.signal(signal.SIGINT, signal_handler)

while (not finished or not interrupted):
    jobs[currentJob]()
    jobsCarriedOut[currentJob] += 1
    currentJob += 1
    if currentJob == len(jobs):
        currentJob, finished = 0, True
    else:
        finished = False

print(jobsCarriedOut)

我从未使用过信号库(甚至听说过它),所以这里是文档 https://docs.python.org/2/library/signal.html

EDIT我从来没有使用过全局变量,所以我的用法可能是错误的。

EDIT TWO第一个示例由于没有捕获每一步的错误,因此只能在 80% 的时间内运行

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按 Ctrl+C 后,如何让 Python 在程序停止之前完成作业? 的相关文章

  • 通过 Scrapy 抓取 Google Analytics

    我一直在尝试使用 Scrapy 从 Google Analytics 获取一些数据 尽管我是一个完全的 Python 新手 但我已经取得了一些进展 我现在可以通过 Scrapy 登录 Google Analytics 但我需要发出 AJAX
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • 如何在flask中使用g.user全局

    据我了解 Flask 中的 g 变量 它应该为我提供一个全局位置来存储数据 例如登录后保存当前用户 它是否正确 我希望我的导航在登录后在整个网站上显示我的用户名 我的观点包含 from Flask import g among other
  • Python(Selenium):如何通过登录重定向/组织登录登录网站

    我不是专业程序员 所以请原谅任何愚蠢的错误 我正在做一些研究 我正在尝试使用 Selenium 登录数据库来搜索大约 1000 个术语 我有两个问题 1 重定向到组织登录页面后如何使用 Selenium 登录 2 如何检索数据库 在我解决
  • 使用 matplotlib 绘制时间序列数据并仅在年初显示年份

    rcParams date autoformatter month b n Y 我正在使用 matpltolib 来绘制时间序列 如果我按上述方式设置 rcParams 则生成的图会在每个刻度处标记月份名称和年份 我怎样才能将其设置为仅在每
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • 如何在 Python 中检索 for 循环中的剩余项目?

    我有一个简单的 for 循环迭代项目列表 在某些时候 我知道它会破裂 我该如何退回剩余的物品 for i in a b c d e f g try some func i except return remaining items if s
  • PyUSB 1.0:NotImplementedError:此平台不支持或未实现操作

    我刚刚开始使用 pyusb 基本上我正在玩示例代码here https github com walac pyusb blob master docs tutorial rst 我使用的是 Windows 7 64 位 并从以下地址下载 z
  • python 相当于 R 中的 get() (= 使用字符串检索符号的值)

    在 R 中 get s 函数检索名称存储在字符变量 向量 中的符号的值s e g X lt 10 r lt XVI s lt substr r 1 1 X get s 10 取罗马数字的第一个符号r并将其转换为其等效整数 尽管花了一些时间翻
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • 如何在 Python 中追加到 JSON 文件?

    我有一个 JSON 文件 其中包含 67790 1 kwh 319 4 现在我创建一个字典a dict我需要将其附加到 JSON 文件中 我尝试了这段代码 with open DATA FILENAME a as f json obj js
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 类型错误:预期单个张量时的张量列表 - 将 const 与 tf.random_normal 一起使用时

    我有以下 TensorFlow 代码 tf constant tf random normal time step batch size 1 1 我正进入 状态TypeError List of Tensors when single Te
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图
  • neo4j - python 驱动程序,服务不可用

    我对 neo4j 非常陌生 我正在尝试建立从 python3 6 到 neo4j 的连接 我已经安装了驱动程序 并且刚刚开始执行第一步 导入请求 导入操作系统 导入时间 导入urllib 从 neo4j v1 导入 GraphDatabas

随机推荐