开始和停止过程

时间:2019-05-05 06:47:08

标签: python

我真的很难缠住Python中的多线程。我对以下代码的期望是appLoop()将运行10秒钟,并且将不复存在-在PyCharm中进行跟踪时会这样做,但在我刚运行它时不会。这导致无限循环。

import time
import multiprocessing

isRunning = True
runningSince = 0

def appLoop():
    try:
        global isRunning
        while isRunning:
            time.sleep(1)
            global runningSince
            runningSince = runningSince + 1
            print(f'Looping since {runningSince} seconds.')
    except KeyboardInterrupt:
        print(f'appLoop stopped after {runningSince} seconds.')

class Process:
    class __Process:

        def __init__(self):
            self.process = multiprocessing.Process(target=appLoop)
            self.process.start()

    instance = None

    def __init__(self):
        if not Process.instance:
            Process.instance = Process.__Process()

    def __del__(self):
        print('Instance deleted.')

p = Process()
time.sleep(10)
isRunning = False
print(f'isRunning set to False.')
del p

这为我提出了(至少...)两个问题:

  • 为什么process之后del p仍在运行-我在这里创建僵尸进程吗?
  • 为什么即使在我运行应用程序时将appLoop()设置为false,我的isRunning仍能继续运行(根据我的观察,这在跟踪上述代码时有效)?

最后,我的用例是能够从Flask Web界面启动/停止appLoop(),这就是为什么我试图在此处实现单例的原因。万一您可能想知道...

而且:我确实不建议您使用__del__,因为您永远不知道何时确切地进行垃圾回收。在这种情况下,我仅将其用于(凹手)调试。

1 个答案:

答案 0 :(得分:0)

isRunning = False在父进程中更改变量的值。子进程(执行while循环的子进程)具有自己的isRunning副本,不受分配影响。

出于相同的原因,del p不会终止该过程:因为它具有自己的p副本。您应该在析构函数中明确终止该过程:

def __del__(self):
    print('Instance deleted.')
    Process.instance.process.terminate()