gpt4 book ai didi

python - 线程未退出python

转载 作者:行者123 更新时间:2023-12-01 05:52:22 26 4
gpt4 key购买 nike

我用 python 编写了一个小型线程示例。我面临的问题是,当线程内出现异常时,该线程会继续运行并且不会退出。我有以下代码:

class Producer (threading.Thread):

def __init__(self, threadId):
threading.Thread.__init__(self)
self.threadId = threadId
self.killReceived = False

def produce(self):
while 1:
if self.killReceived == True:
print self.threadId+"inside kill section"
return False
print "running"
time.sleep(1)
raise Exception('boo')

def run(self):
try:
self.produce()
except Exception as e:
ThreadManager.getInstance().shutdown(self.threadId)

def stop(self):
self.killReceived = True

class ThreadManager:
_instance = None

@staticmethod
def getInstance():
if ThreadManager._instance == None:
ThreadManager._instance = ThreadManager()
return ThreadManager._instance

def __init__(self):
''' some initializations '''

def shutdown(self, threadId):
while threading.active_count() > 1:
for thread in threading.enumerate():
if type(thread) != threading._MainThread: #never kill main thread directly
thread.stop()
#print thread.threadId+" is alive? "+str(thread.isAlive())

当我在生产者内部引发异常时,它会被捕获并触发 ThreadManager 的 shutdown 方法,该方法依次调用除主线程之外的所有正在运行的线程的 stop() 方法。消费者使用此策略退出,但生产者挂起。如果我运行 isAlive 方法,我会看到生产者线程仍在运行,但它的 run 方法不再运行。因为它不再打印 running。由于异常从 run() 内部的 product 方法中冒出,因此线程应该自动完成。但事实并非如此。那么制作人到底在哪里呢?当出现异常时如何让它停止?

最佳答案

ThreadManager 的 shutdown 未正确同步;它基本上是一个永远不会退出的 while threading.active_count() > 1 循环。如果两个或多个线程在此方法中结束,它们(以及程序)将永远不会退出。

不要不断地调用随机线程(这甚至可能与您的线程无关),只需在 ThreadManager 中保留所有已启动线程的 list ,然后对每个线程调用一次stop。另外,实际调用 stop 的代码应该移至 ThreadManager,它逻辑上所属的位置。

此外,ThreadManager.getInstance 不是线程安全的;您最终可能会得到多个 ThreadManager。您应该使用 lock .

总而言之,您似乎正在重新实现 ThreadPoolExecutor 。你为什么不使用它呢?

关于python - 线程未退出python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13722196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com