Python 在脚本仍在运行时杀死守护进程线程
我的python脚本创建了很多线程,它们都是守护进程线程,我发现出现了一个错误,说“内存不足” 如何在脚本/应用程序运行时终止守护进程线程? 我理解守护进程线程的概念,即当进程(脚本或应用程序)关闭/完成时,它们会自行销毁。但我想在脚本仍在运行时杀死一些守护进程线程,以避免出现“内存不足”错误 当队列中没有更多任务时,下面的线程是否会自动终止Python 在脚本仍在运行时杀死守护进程线程,python,multithreading,Python,Multithreading,我的python脚本创建了很多线程,它们都是守护进程线程,我发现出现了一个错误,说“内存不足” 如何在脚本/应用程序运行时终止守护进程线程? 我理解守护进程线程的概念,即当进程(脚本或应用程序)关闭/完成时,它们会自行销毁。但我想在脚本仍在运行时杀死一些守护进程线程,以避免出现“内存不足”错误 当队列中没有更多任务时,下面的线程是否会自动终止 class ParsePageThread(threading.Thread): THREAD_NUM = 0 def __init__
class ParsePageThread(threading.Thread):
THREAD_NUM = 0
def __init__(self, _queue):
threading.Thread.__init__(self)
self.queue = _queue
def run(self):
while(True):
try:
url = self.queue.get()
except Queue.Empty,e:
return # WILL this kill the thread?
finally:
self.queue.task_done()
我先回答你的第二个问题,因为这更容易。是的,从run方法返回确实会停止线程。详细的解释如下: 要在线程自然完成之前停止它的运行,您必须更具创造性。线程对象上没有直接终止方法。您需要做的是使用一个共享变量来定义线程的状态
alive = True
class MyThread(threading.Thread):
def run():
while(alive):
#do work here
在另一段代码中,当您检测到停止该线程的条件时,另一个线程只是将活动设置为False:
alive = False
这是一个简单的例子,我将把它留给您来扩展到多个线程
危险
这个例子之所以有效,是因为在python中,由于全局解释器锁,读取和设置布尔变量是原子操作。这是一个关于低级python线程的优秀教程。您应该坚持使用队列对象,因为这正是它的用途
如果您所做的不仅仅是从多个线程读取和设置简单变量,那么您应该根据您的设计和需要使用或替代。即使是像没有锁的比较和交换这样简单的操作,也会在程序中导致很难调试的问题
python多线程的另一条建议是永远不要在解释器线程中做任何重要的工作。它应该设置并启动所有其他线程,然后休眠或等待,直到程序退出。原因是没有其他python线程可以接收操作系统。这意味着没有其他线程可以处理
Ctrl+C
akaKeyboardInterrupt
异常。让主线程处理KeyboardInterrupt
异常,然后将所有活动变量设置为False,这样您就可以快速退出程序,这是一种很好的做法。这在开发过程中特别有用,这样你就不必在犯错误时不断地杀掉东西。这听起来像是你做了错事。如果您可能会耗尽所有内存而不是杀死随机内存,那么不启动线程不是更好吗?您可能会受益于更高的抽象级别,例如(重用线程来完成工作,而不是创建新的线程)现在还不清楚,RLock
是否更好:@J.F.Sebastian这些都是好的观点,我同意RLock不一定更好。它们可以更实用,使界面设计更简单。这样,当您持有或不持有锁时,就不必指定不同的接口。特别是在Python中,由于GIL,使代码多线程化并不能真正提高速度。在几乎所有情况下,通过增加锁定开销,实际上都会降低速度,所以我尽量避免线程。我发现当我必须用Python进行多线程处理时(通常是因为外部库),RLock更方便。这是一个非常好的主意,但是,我遇到了一个更有趣的问题。。。当试图与远程服务器建立tty会话时,线程有时会挂起,因此我将无法使用“活动”标志。有没有其他方法可以终止线程?