Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在脚本仍在运行时杀死守护进程线程_Python_Multithreading - Fatal编程技术网

Python 在脚本仍在运行时杀死守护进程线程

Python 在脚本仍在运行时杀死守护进程线程,python,multithreading,Python,Multithreading,我的python脚本创建了很多线程,它们都是守护进程线程,我发现出现了一个错误,说“内存不足” 如何在脚本/应用程序运行时终止守护进程线程? 我理解守护进程线程的概念,即当进程(脚本或应用程序)关闭/完成时,它们会自行销毁。但我想在脚本仍在运行时杀死一些守护进程线程,以避免出现“内存不足”错误 当队列中没有更多任务时,下面的线程是否会自动终止 class ParsePageThread(threading.Thread): THREAD_NUM = 0 def __init__

我的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方法返回确实会停止线程。详细的解释如下:

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

alive = True

class MyThread(threading.Thread):
    def run():
        while(alive):
            #do work here
在另一段代码中,当您检测到停止该线程的条件时,另一个线程只是将活动设置为False:

alive = False
这是一个简单的例子,我将把它留给您来扩展到多个线程

危险 这个例子之所以有效,是因为在python中,由于全局解释器锁,读取和设置布尔变量是原子操作。这是一个关于低级python线程的优秀教程。您应该坚持使用队列对象,因为这正是它的用途

如果您所做的不仅仅是从多个线程读取和设置简单变量,那么您应该根据您的设计和需要使用或替代。即使是像没有锁的比较和交换这样简单的操作,也会在程序中导致很难调试的问题


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

这听起来像是你做了错事。如果您可能会耗尽所有内存而不是杀死随机内存,那么不启动线程不是更好吗?您可能会受益于更高的抽象级别,例如(重用线程来完成工作,而不是创建新的线程)现在还不清楚,
RLock
是否更好:@J.F.Sebastian这些都是好的观点,我同意RLock不一定更好。它们可以更实用,使界面设计更简单。这样,当您持有或不持有锁时,就不必指定不同的接口。特别是在Python中,由于GIL,使代码多线程化并不能真正提高速度。在几乎所有情况下,通过增加锁定开销,实际上都会降低速度,所以我尽量避免线程。我发现当我必须用Python进行多线程处理时(通常是因为外部库),RLock更方便。这是一个非常好的主意,但是,我遇到了一个更有趣的问题。。。当试图与远程服务器建立tty会话时,线程有时会挂起,因此我将无法使用“活动”标志。有没有其他方法可以终止线程?