我真的很难用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)调试
isRunning = False
更改父进程中变量的值。子进程(执行while循环的进程)有自己的isRunning
副本,该副本不受赋值的影响出于同样的原因,
del p
不会终止进程:因为它有自己的p
副本。您应该在析构函数中显式终止进程:相关问题 更多 >
编程相关推荐