进程线程无法感知全局变量的变化

时间:2019-07-19 05:44:13

标签: python python-3.x

我试图测试一些进程线程,这些线程将以flag变量结尾,但是它无法检测到flag的更改并继续执行无限的while循环。

from multiprocessing import Process, Queue
from time import sleep

flag = 1

def threadTest():
    while 1:
        if flag == 1:
            print('hi')
        else:
            break
        sleep(0.1)


def main():
    global flag
    thread = Process(target=threadTest)
    thread.start()
    sleep(5)
    flag = 0
    thread.join()
    print('thread exit')



if __name__ == "__main__":
    main()

我的全局变量声明有问题吗?

2 个答案:

答案 0 :(得分:2)

您实际上是在创建进程,而不是线程。 在创建新流程时,主状态会“复制”到新流程,并且现在与主流程无关。因此,对于该新流程,标记始终为1。

只需import threading并更改为:

thread = threading.Thread(target=threadTest)

它应该可以工作。

我还将建议将flag更改为布尔值,因为它用作循环的条件。

答案 1 :(得分:0)

如果您确实要使用多个进程而不是线程,那么可以通过多种方式与子进程进行通信。一种简单的方法是将TERM信号发送到子进程,并且它应该适当地处理它。还有其他几个选项,例如使用SharedMemory等。

下面是使用TERM信号修改的代码。

from multiprocessing import Process, Queue
from time import sleep
import signal

flag = 1

def exitHandler(signum, frame):
    global flag
    flag = 0
    print('Got the signal to stop. Flag set to 0.')


def threadTest():
    signal.signal(signal.SIGINT, exitHandler)
    signal.signal(signal.SIGTERM, exitHandler)
    while 1:
        if flag == 1:
            print('hi')
        else:
            print('Finally we are here!')
            break
        sleep(0.1)


def main():
    global flag
    process = Process(target=threadTest)
    process.start()
    print(process.pid)
    sleep(5)
    process.terminate()
    process.join()
    print('process exit')


if __name__ == "__main__":
    main()