繁体   English   中英

启动和停止流程

[英]Starting and stopping a process

我真的很难在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

这给我带来了(至少......)2个问题:

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

我的用例最终是能够从烧瓶网页界面启动/停止我的appLoop() - 这就是为什么我在这里尝试实现单例。 万一你可能想知道......

并且:我知道不建议使用__del__因为你永远不知道垃圾收集何时会调用它 - 在这种情况下我只是用它来进行(洞穴人)调试。

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

出于同样的原因, del p不会终止进程:因为它有自己的p副本。 您应该在析构函数中显式终止进程:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM