Python - 轮询变量

时间:2015-07-21 07:41:58

标签: python signals python-multithreading

我在信号处理程序中更改了一个全局变量,并在主程序中对其进行轮询。但是主线程中的值不会改变。

我是否需要使用限定符来使其成为易变(如Java)变量?

以下是该计划:

test.py

import time
import signal

def debug():
    closeSession = False

    def sigint_handler(signal, frame):
        global closeSession

        print('Breaking the poll...')
        closeSession=True

    signal.signal(signal.SIGINT, sigint_handler)

    # Start a program...

    while not closeSession:
        time.sleep(1)
        print('Polling... closeSession = %r' % closeSession)

    print('Exiting! Bye.')
    # Sent 'quit' to stdin of the program

if __name__ == "__main__":
    debug()
每当我按 Ctrl + C 时,

sigint_handler()会被调用,但主线程中不会使用closeSession的新值。

我得到以下输出:

  

$ python test.py
轮询... closeSession = False轮询......   closeSession = False

我按 Ctrl + C

  

^破坏民意调查......
民意调查...... closeSession = False

再次按 Ctrl + C

  

^破坏民意调查......
民意调查...... closeSession = False

再次按 Ctrl + C

  

^破坏民意调查......
民意调查...... closeSession = False
  轮询... closeSession = False

2 个答案:

答案 0 :(得分:2)

问题在于范围。

debug()函数中,您没有将closeSession声明为全局,这意味着您有两个名为closeSession的变量。 debug()函数中的一个全局范围和一个范围。在sigint_handler()函数中,您已明确指示使用全局函数,该函数由外部函数中的作用域遮蔽。

您可以通过在debug()

中分配之前声明全局来解决此问题
def debug():
    global closeSession
    closeSession = False
    ...

顺便说一下,你的代码在windows上不起作用,它会抛出一个IOError,因为sleep函数被中断了。对我有用的解决方法是:

...
while not closeSession:
    try:
        time.sleep(1)
    except IOError:
        pass
    print('Polling... closeSession = %r' % closeSession)
...

它不漂亮但它有效。

答案 1 :(得分:1)

您必须在访问变量之前设置global closeSession,否则您将创建一个具有相同名称的本地变量,并且循环永远不会结束。

试试这个:

import time
import signal

def debug():
    global closeSession # <-- this was missing
    closeSession = False

    def sigint_handler(signal, frame):
        global closeSession
        print('Breaking the poll...')
        closeSession=True

    signal.signal(signal.SIGINT, sigint_handler)

    # Start a program...

    while not closeSession:
        time.sleep(1)
        print('Polling... closeSession = %r' % closeSession)

    print('Exiting! Bye.')
    # Sent 'quit' to stdin of the program

if __name__ == "__main__":
    debug()