仅当程序准备就绪时才发出退出信号

2024-10-02 16:21:55 发布

您现在位置:Python中文网/ 问答频道 /正文

Duplicate of How to prevent a block of code from being interrupted by KeyboardInterrupt in Python?

目的:

  • 当程序收到一个信号时,它只有在准备就绪时才退出。你知道吗

问题:

  • 期望的行为:
    • 信号在目标封锁期间到达。程序在目标块完成后退出。你知道吗
    • 信号到达目标区块外。程序退出。你知道吗
  • 当前行为:
    • 信号在目标封锁期间到达。程序挂起。你知道吗
    • 信号到达目标区块外。程序退出。你知道吗

你知道吗

我的设计的通用实现:

import threading, signal

def huphandler(signum, frame):
    with sig_lock:
        os._exit(0)

def loop():
    print 'in lock'
    time.sleep(5)

def idle_loop():
    while True:
        with sig_lock:
            t = multiprocessing.Process(target=loop)
            t.start()
            t.join()
        print 'out lock'
        time.sleep(5)

sig_lock = threading.Lock()
signal.signal(signal.SIGHUP, huphandler)
idle_loop()

Tags: ofin程序looplock目标signal信号
2条回答

1.1。问题:

  • 信号处理程序将中断主线程,导致deadlock。你知道吗

1.2。解决方案:

  • 使用布尔值而不是锁。你知道吗

2.1。问题:

  • 当线程被中断时,它可能会停止不稳定的中间操作(即time.sleep)。你知道吗

2.2。解决方案:

  • 为了获得更高的稳定性,请将目标代码包装到子流程中。你知道吗

你知道吗

提供所需结果的通用实现:

import threading, signal

def huphandler(signum, frame):
    print idle_loop.sig_lock
    if idle_loop.sig_lock:
        idle_loop.continuee = False
    else:
        print 'dont b here'
        os._exit(0)

def loop():
    print 'in lock'
    time.sleep(5)

def idle_loop():
    while True:
        idle_loop.sig_lock = True
        t = multiprocessing.Process(target=loop)
        t.start()
        t.join()
        print 'out lock'
        if idle_loop.continuee:
            idle_loop.sig_lock = False
            time.sleep(5)
        else: return


idle_loop.sig_lock = False
idle_loop.continuee = True
signal.signal(signal.SIGHUP, huphandler)
idle_loop()

如果用获得的锁终止,那么程序将处于死锁状态。你知道吗

因为您刚刚终止了持有锁的线程或子进程,所以它无法再释放它。然后您的主线程或任何其他线程将尝试获取锁,并阻塞直到锁可用。因此,以僵局告终。你知道吗

相关问题 更多 >