我试图测试一些进程线程,这些线程将以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()
我的全局变量声明有问题吗?
答案 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()