Python2中while循环条件改变,能够立刻被监测

"""
Only can run in unix, because of module python-daemon==2.3.0
"""
import os
import signal
import sys
import time
import daemon


def get_engine_pid():
    if os.path.exists('/root/test_while_dir/test_pid'):
        with open('/root/test_while_dir/test_pid', 'r') as f:
            pid = int(f.read())
            return pid
    return -1


class A:
    def __init__(self):
        self.is_stop = False

    def handle_stop(self, signum, frame):
        print("Got stop signal")
        self.is_stop = True

    def task(self):
        log = open('/root/test_while_dir/daemon.log', 'a')
        with daemon.DaemonContext(stdout=log, stderr=log):
            os.system("echo %d > %s" % (os.getpid(), '/root/test_while_dir/test_pid'))
            signal.signal(signal.SIGINT, self.handle_stop)
            signal.signal(signal.SIGTERM, self.handle_stop)
            signal.signal(signal.SIGQUIT, self.handle_stop)
            while not self.is_stop:
                print(time.time())
                time.sleep(20)
            print('killed success {}'.format(os.getpid()))
            # os.kill(os.getpid(), signal.SIGTERM)

    def stop(self):
        print('stop')
        self.is_stop = True


if __name__ == '__main__':
    if not os.path.exists('/root/test_while_dir/'):
        os.makedirs('/root/test_while_dir/')
    if len(sys.argv) == 2:
        print('kill {}'.format(get_engine_pid()))
        pid = get_engine_pid()
        if pid != -1:
            os.kill(get_engine_pid(), signal.SIGTERM)
    else:
        a = A()
        print(a.is_stop)
        a.task()
        time.sleep(5)
        print(a.is_stop)

以上代码在python2,和python3中的运行会有不同结果:

python test_while.py

再执行:

python test_while.py stop

在python2中,日志daemon.log中会立刻输出:

Got stop signal
killed success 261843
True

但是在python3中,会等到time.sleep(20) 休眠20秒之后,再次进入while not self.is_stop循环,发现self.is_stop已经为True了,才会输出:

Got stop signal
killed success 261843
True

原因待分析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Python,`while True`是一个无限循环的语句,它会不断地重复执行它所包含的代码块,直到遇到了一个 `break` 语句或者程序被强制终止为止。 例如,下面的代码使用了 `while True` 来实现一个简单的计数器,它会一直输出数字直到你断程序的运行: ``` count = 0 while True: print(count) count += 1 ``` 这个程序会一直输出计数器的值,直到你手动停止程序的运行。如果你想要退出循环,可以在循环体内部使用 `break` 语句来跳出循环,例如: ``` count = 0 while True: print(count) count += 1 if count > 10: break ``` 这个程序会一直输出计数器的值,直到计数器的值超过了 10,然后程序会跳出循环并停止运行。 ### 回答2: 在Python,`while True` 是一个循环语句,意味着无限循环。该语句会一直执行,直到遇到`break`语句或者程序被强制终止。 `while True`常用于需要无限循环的情况,比如编写一个服务器程序,等待客户端连接或者一个监控程序不断监测某个事件。 使用`while True`可以创建一个永久循环,但要确保在循环体内有合适的退出条件,否则程序将一直运行。可以在循环体内使用`if`语句检查退出条件,并使用`break`语句退出循环。 下面是一个简单示例,展示了`while True`的用法: ```python while True: user_input = input("请输入数字:") if user_input == "quit": break else: number = int(user_input) result = number * 2 print("结果是:", result) ``` 在以上示例,程序会持续询问用户输入一个数字,并计算输入数字的两倍,直到用户输入"quit"为止。当用户输入"quit"时,程序执行`break`语句,跳出循环,结束程序运行。 需要注意的是,在使用`while True`时要小心避免出现无限循环,以免造成程序崩溃或运行时间过长的问题。 ### 回答3: 在Python,while True是一个无限循环语句,它的条件部分永远为True,因此会一直执行循环体内的代码,直到遇到break语句或者程序被手动终止。 使用while True可以实现很多不同的功能。例如,我们可以在一个无限循环接收用户输入,而不需要指定循环次数。我们可以在循环体内对用户输入进行逻辑判断和处理,直至满足特定条件后结束循环。 另一个常见的用法是作为一个守护线程运行的主循环。在这种情况下,while True可以用来实现一个持续运行的后台任务,例如监听网络请求、处理消息队列等。在这种情况下,循环体内通常会执行一些重复性的操作,例如从队列获取任务,执行任务,并可能在任务完成后将结果返回或发布给其他部分。 需要注意的是,由于while True是一个无限循环,如果在循环体内没有合适的地方终止循环,程序可能会陷入死循环。因此,在使用while True时,我们需要在合适的时机使用break语句来主动终止循环,或者确保循环体内的条件可以在某个条件满足时退出循环。 以上是关于Pythonwhile True的用法的简要介绍,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值