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

原因待分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值