当前位置: 首页 > 面试题库 >

如何在Python中安全地停止无限循环?

谭晓博
2023-03-14
问题内容

我有一个运行在无限循环上的脚本,并将其添加到数据库中,并且执行了一些我不能只停止一半的事情,所以我不能只按ctrl + C并停止它。

我希望能够以某种方式停止while循环,但是让它在停止之前完成最后一次迭代。

让我澄清一下:

我的代码看起来像这样:

while True:
    does something
    does more things
    does more things

我希望能够在结束或开始时中断while循环,但不要在执行操作之间中断,因为那样会很不好。

而且我不希望它在每次迭代后问我是否要继续。

感谢您提供的出色答案,我非常感谢,但是我的实现似乎无法正常工作:

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

class Crawler():
    def __init__(self):
    # not relevent

    def crawl(self):
        interrupted = False
        signal.signal(signal.SIGINT, signal_handler)
        while True:
            doing things
            more things

            if interrupted:
                print("Exiting..")
                break

当我按ctr + c时,程序一直在忽略我


问题答案:

您需要做的是捕获中断,设置一个标志,说您已被中断,但是继续进行操作,直到需要检查该标志为止(在每个循环结束时)。由于python的try-
except构造将放弃循环的当前运行,因此您需要设置适当的信号处理程序;它会处理中断,但随后让python从中断处继续执行。这是如何做:

import signal

import time   # For the demo only

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

signal.signal(signal.SIGINT, signal_handler)


interrupted = False
while True:
    print("Working hard...")
    time.sleep(3)
    print("All done!")

    if interrupted:
        print("Gotta go")
        break

笔记:

  1. 从命令行使用它。在IDLE控制台中,它将踩踏IDLE自己的中断处理。

  2. 更好的解决方案是在循环期间“阻止” KeyboardInterrupt,并在轮询中断时取消阻止。这是某些Unix风格的功能,但不是全部,因此python不支持它(请参阅第三个“常规规则”)

  3. OP希望在一个类中执行此操作。但是中断函数是由信号处理系统调用的,有两个参数:信号编号和指向堆栈帧的指针-self参数不能访问类对象。因此,设置标志的最简单方法是使用全局变量。您可以使用闭包来绑定指向本地上下文的指针(即,在中动态定义信号处理程序__init__(),但是坦率地说,除非由于多线程或其他原因导致全局变量成为问题,否则我不会打扰。

注意:
如果您的进程处于系统调用的中间,则处理信号可能会中断系统调用。因此,这可能不适用于所有应用程序。更安全的选择是(a)在每个循环迭代的末尾使用非阻塞读取(而不是依赖信号)(并键入输入而不是^
C);(b)使用线程或进程间通信将工作人员与信号处理隔离开;或(c)如果您使用的是具有信号屏蔽功能的操作系统,请执行该操作。它们都在某种程度上依赖于操作系统,因此我将其保留下来。



 类似资料:
  • 我正在尝试做一个数字猜测游戏,如果用户匹配他们赢得现金的幸运数字,游戏将继续进行,直到他们用完现金。他们每打一轮都要付赌注。每一轮都会产生一个新的随机数。 我只想使用一个输入。当我把输入放在循环中,循环无限停止循环,当我把它放在循环外,它无限开始循环。我该怎么阻止这一切?我需要向while循环添加什么?我尝试突破,但我想继续比赛,直到钱用完。 我只想使用一个输入,但是当我把输入带出循环(lucky

  • 不知道如何阻止这个while循环无限重复。我使用检查用户输入是否为int。如果没有输入int值,则循环将无限重复。

  • 我正在开发一个简单的python程序,其中包括创建一个圆圈“按钮”,然后让用户在圆圈内单击。如果他们没有点击圆圈,会出现一条消息,说明他们在圆圈外点击,应该再试一次。然而,在最后一部分,我得到了一个关于代码的无休止的循环,尽管使用了中断。是否有任何人可以帮助查看是否存在错误?谢谢

  • 启动无限循环后,我无法关闭JFrame。 我想停止无限循环使用停止按钮。 我用开始按钮开始一个无限循环。我想用“停止”按钮关闭那个回路。 > if(stop.getModel(). isP的()){中断;}不工作 actionListener用于识别按钮单击并在循环也不起作用时使用中断语句终止 点击停止按钮,无限循环必须终止。在使用start Button启动无限循环后,我无法使用JFrame中的

  • 问题内容: 有没有一种方法可以停止执行无限循环的线程? 问题答案: 是的,您可以将替换(或在逻辑上)。 这样,当任务取消时,循环将终止。 循环看起来像这样: 使用应该是这样的:

  • 在我的项目中,用户和产品之间存在多对多关系。一个用户可以拥有许多产品,一个产品可以被许多用户拥有。 使用者JAVA Product.java 在我的控制器中,我有一个路径,可以让我获得所有用户以及与用户相关联的嵌套产品,如下所示。 这很好,但我现在想获取所有应该有嵌套用户的产品(获取所有产品并查看哪些用户正在使用它们)。在尝试这样做时,我遇到了一个递归问题,我在产品上使用了JsonIgnore。j