我有一个产生线程的服务。 我可能在我正在使用的代码中泄漏资源 我在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方法后会死吗?
我是否导致资源泄漏?
答案 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()方法测试线程是否存活。