В питоне, когда умирают потоки? - PullRequest
0 голосов
/ 16 февраля 2012

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

2 голосов
/ 16 февраля 2012

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

Из 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 :

with open('example.txt') as my_file:
     # bunch of operations with the file
# other operations for which you don't need the file
1 голос
/ 16 февраля 2012

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

С сайта python

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...