在python中线程死了吗?

时间:2012-02-16 08:56:54

标签: python multithreading resources

我有一个产生线程的服务。 我可能在我正在使用的代码中泄漏资源 我在python中使用类似的代码

import threading

class Worker(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        # now i am using django orm to make a query
        dataList =Mydata.objects.filter(date__isnull = True )[:chunkSize]
        print '%s - DB worker finished reading %s entrys' % (datetime.now(),len(dataList))

while True:
    myWorker = Worker()
    mwWorker.start()
    while myWorker.isalive():  # wait for worker to finish 
        do_other_work()

没关系?
线程在完成执行run方法后会死吗? 我是否导致资源泄漏?

2 个答案:

答案 0 :(得分:2)

查看您的previous question(您在评论中链接)问题是您的文件描述符用完了

来自official doc

  

文件描述符是与当前进程打开的文件对应的小整数。例如,标准输入通常是文件描述符0,标准输出是1,标准错误是2.然后,进程打开的其他文件将分配3,4,5等。名称“文件描述符”略有欺骗性;在Unix平台上,套接字和管道也由文件描述符引用。

现在我猜,但可能是你正在做的事情:

class Wroker(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        my_file = open('example.txt')
        # operations
        my_file.close()   # without this line!

您需要关闭文件!

您可能正在启动许多线程,并且每个线程都打开但没有关闭文件,这样一段时间后您没有更多的“小整数”来分配打开新文件。

另请注意,在#operations部分可能发生任何事情,如果抛出异常,除非包含在try/finally语句中,否则文件不会关闭。

有一种更好的方法来处理文件:with statement

with open('example.txt') as my_file:
     # bunch of operations with the file
# other operations for which you don't need the file

答案 1 :(得分:1)

  

创建线程对象后,必须通过调用线程的start()方法启动其活动。这将在单独的控制线程中调用run()方法。   一旦线程的活动开始,线程就被认为是“活着的”。 当run()方法终止时,它会停止活动 - 正常情况下,或者通过引发未处理的异常。 is_alive()方法测试线程是否存活。

来自python site