python - 当脚本仍在运行时终止守护线程

标签 python multithreading

我的Python脚本创建了很多线程,它们都是守护线程,我发现我收到一条错误消息“内存不足”。

如何在脚本/应用程序运行时终止守护线程?

我理解守护线程的概念,当我的进程(脚本或应用程序)关闭/完成时,它们会自行销毁。但我想在脚本仍在运行时终止一些守护线程,以避免出现“内存不足”错误。

当队列中没有更多任务时,我下面的线程会自行终止吗?

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 方法返回确实会停止线程。详细解释为threading: Thread Objects文档。

要在自然完成之前停止正在运行的线程,您必须更有创意。线程对象没有直接的kill方法。您需要做的是使用共享变量来定义线程的状态。

alive = True

class MyThread(threading.Thread):
    def run():
        while(alive):
            #do work here

在其他一些代码中,当您检测到停止该线程的条件时,另一个线程只需将事件设置为 False:

alive = False

这是一个简单的示例,我将让您自行扩展至多线程。

危险

这个示例之所以有效,是因为由于全局解释器锁的原因,读取和设置 bool 变量在 python 中是原子操作。 Here是一个关于底层 Python 线程的优秀教程。您应该坚持使用 Queue 对象,因为这正是它的用途。

如果您除了从多个线程读取和设置简单变量之外还执行其他操作,则应该使用 Locks或者 Reentrant Locks取决于您的设计和需求。即使像不带锁的比较和交换这样简单的事情也会导致程序中出现非常难以调试的问题。

关于 python 多线程的另一条建议是永远不要在解释器线程中做任何重要的工作。它应该设置并启动所有其他线程,然后休眠或等待 condition object直到程序退出。原因是没有其他python线程可以接收操作系统signals 。这意味着没有其他线程可以处理 Ctrl+C 又名 KeyboardInterrupt 异常。最好让主线程处理 KeyboardInterrupt 异常,然后将所有事件变量设置为 False,以便您可以快速退出程序。这在开发时特别有用,这样你就不必在犯错误时不断地杀死东西。

关于python - 当脚本仍在运行时终止守护线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9747994/

相关文章:

python - Django 异步处理

python - 使用 RDFLib 时处理缺少 <> 封闭 URL

java - 无法唤醒线程

java - 多线程处理中静态成员的意外行为

c# - 线程和 SqlFileStream。进程无法访问指定的文件,因为它已在另一个事务中打开

python - 如何调整文件夹中多个图像的大小,将其转换为灰度并将其保存到另一个文件夹中?

python : UTF-8 : How to count number of words in UTF-8 string?

python - 返回 self python的目的

multithreading - 我们如何创建多个 Ignite 实例?

c - 使用 pthreads 管理链表