2012-02-16 7 views
-1

У меня есть служба, которая порождает темы. И у меня может быть утечка ресурсов в коде, который я использую.
У меня есть подобный код в Python, который использует темуВ 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() 

это нормально?
будут ли нити умирать, когда они закончат выполнение метода запуска?
Я могу вызвать утечку ресурсов?

+0

* «Я, возможно, утечка ресурсов» * Что заставляет вас думать так.? –

+1

Не забудьте «присоединиться» к потокам –

+0

, что заставляет меня думать, что у меня есть утечка, это http://stackoverflow.com/questions/9292567/operationalerror-2001-cant-create-unix-socket-24 – yossi

ответ

2

Глядя на ваш previous question (что вы linkd в комментарии) проблема заключается в том, что вы бежите из файловых дескрипторов.

От 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 
+0

i я не делаю open (..) Я делаю mysql-запрос с помощью django - dataList = Mydata.objects.filter (date__isnull = True) [: chunkSize] print '% s - Рабочий рабочий DB закончил чтение% s entrys'% (datetime ,now(), len (dataList)) – yossi

+0

@yossi: В вашем примере вы просто «печатаете», и это само по себе никогда не будет просачиваться, поэтому вы должны обновить свой вопрос с помощью своего реального/псевдокода, иначе это будет трудно расскажите, что происходит. –

+0

Вы правы, я его отредактировал. – yossi

1

Как только объект потока создается, его действие необходимо запустить, вызвав метод start() потока. Это вызывает метод run() в отдельном потоке управления. Как только активность потока запускается, поток считается «живым». Он перестает быть живым, когда его метод run() завершает - либо в обычном режиме, либо путем поднятия необработанного исключения. Метод is_alive() проверяет, жив ли поток.

От python site

Смежные вопросы