[英]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.