我真的很难缠住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__
,因为您永远不知道何时确切地进行垃圾回收。在这种情况下,我仅将其用于(凹手)调试。
答案 0 :(得分:0)
isRunning = False
在父进程中更改变量的值。子进程(执行while循环的子进程)具有自己的isRunning
副本,不受分配影响。
出于相同的原因,del p
不会终止该过程:因为它具有自己的p
副本。您应该在析构函数中明确终止该过程:
def __del__(self):
print('Instance deleted.')
Process.instance.process.terminate()