启动和停止进程

2024-09-29 23:17:21 发布

您现在位置: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()即使在我运行应用程序时将isRunning设置为false后仍然保持运行(根据我的观察,这在跟踪上述代码时有效)

最后,我的用例是能够从flask web界面启动/停止我的appLoop()——这就是为什么我要在这里实现一个单例。万一你想知道

而且:我知道不建议使用__del__,因为您永远不知道垃圾回收何时会调用它——在本例中,我只是将它用于(cave-man)调试


Tags: instance代码importselftimedefmultiprocessingprocess
1条回答
网友
1楼 · 发布于 2024-09-29 23:17:21

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

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

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

相关问题 更多 >

    热门问题