Вопрос по python, multithreading – «Не удается запустить новую тему потока» в Python

4

Я запускаю скрипт, который извлекает информацию из пакетов Debian и сохраняет ее в базе данных.

После извлечения информации из примерно 100 пакетов возникает ошибка. Ошибка заключается в том, что «не удается начать новый поток» Почему я сталкиваюсь с этой ошибкой? Что может быть возможным решением этого?

Это код, используемый для сохранения данных:

for i in list_pack:

      if not i in oblist:        
        #Creating Packages
            slu=slugify(i)
            ob=Gbobject()
            ob.title=i
            ob.slug=slu
            ob.content=''
            ob.tags=tagname
        #with reversion.create_revision():
            ob.save()
            gb=Gbobject.objects.get(title=i)
            gb.objecttypes.add(Objecttype.objects.get(title='Packages'))
            gb.sites.add(Site.objects.get_current())
        #with reversion.create_revision():
            gb.save()
            gd=Gbobject.objects.get(title=i)
            print 'The Object created was',gd


            #Decsription
            try:
                atv=package_description_dict[i]
                atvalue=unicode(atv,'utf-8')
            except UnicodeDecodeError:
                pass
            try:
                lo=Gbobject.objects.get(title=i)
                loid=NID.objects.get(id=lo.id)
            except Gbobject.DoesNotExist:
                pass
            if atvalue<>'':
                slu=slugify(atvalue)
                at=Attribute()
                at.title=atvalue
                at.slug=slu
                at.svalue=atvalue
                at.subject=loid
                att=Attributetype.objects.get(title='Description')
                at.attributetype=att
                #with reversion.create_revision():
                at.save()                    
                print 'yeloow13'

КакDescriptionЕсть еще около 2 свойств пакета, которые сохраняются аналогичным образом.

Это полная трассировка, которую я получаю при возникновении ошибки:

    error                                     Traceback (most recent call last)

/home/radhika/Desktop/dev_75/gnowsys-studio/demo/<ipython console> in <module>()

/usr/local/lib/python2.6/dist-packages/django_gstudio-0.3.dev-py2.6.egg/gstudio/Harvest/debdata.py in <module>()
   1086 # create_attribute_type()

   1087 # create_relation_type()

-> 1088 create_objects()
   1089 #create_sec_objects()

   1090 #create_relations()


/usr/local/lib/python2.6/dist-packages/django_gstudio-0.3.dev-py2.6.egg/gstudio/Harvest/debdata.py in create_objects()
    403             ob.sites.add(Site.objects.get_current())
    404             #with reversion.create_revision():

--> 405             ob.save()
    406             #time.sleep(10)

    407             #gd=Gbobject.objects.get(title=i)


/usr/local/lib/python2.6/dist-packages/django_reversion-1.6.0-py2.6.egg/reversion/revisions.pyc in do_revision_context(*args, **kwargs)
    298             try:
    299                 try:
--> 300                     return func(*args, **kwargs)
    301                 except:
    302                     exception = True

/usr/local/lib/python2.6/dist-packages/django_gstudio-0.3.dev-py2.6.egg/objectapp/models.pyc in save(self, *args, **kwargs)
    658     @reversion.create_revision()
    659     def save(self, *args, **kwargs):
--> 660         super(Gbobject, self).save(*args, **kwargs) # Call the "real" save() method.
    661 
    662 

/usr/local/lib/python2.6/dist-packages/django_reversion-1.6.0-py2.6.egg/reversion/revisions.pyc in do_revision_context(*args, **kwargs)
    298             try:
    299                 try:
--> 300                     return func(*args, **kwargs)
    301                 except:
    302                     exception = True

/usr/local/lib/python2.6/dist-packages/django_gstudio-0.3.dev-py2.6.egg/gstudio/models.pyc in save(self, *args, **kwargs)
    327     @reversion.create_revision()
    328     def save(self, *args, **kwargs):
--> 329         super(Node, self).save(*args, **kwargs) # Call the "real" save() method.
    330 
    331 

/usr/local/lib/python2.6/dist-packages/django/db/models/base.pyc in save(self, force_insert, force_update, using)
    458         if force_insert and force_update:
    459             raise ValueError("Cannot force both insert and updating in model saving.")
--> 460         self.save_base(using=using, force_insert=force_insert, force_update=force_update)
    461 
    462     save.alters_data = True

/usr/local/lib/python2.6/dist-packages/django/db/models/base.pyc in save_base(self, raw, cls, origin, force_insert, force_update, using)
    568         if origin and not meta.auto_created:
    569             signals.post_save.send(sender=origin, instance=self,
--> 570                 created=(not record_exists), raw=raw, using=using)
    571 
    572 

/usr/local/lib/python2.6/dist-packages/django/dispatch/dispatcher.pyc in send(self, sender, **named)
    170 
    171         for receiver in self._live_receivers(_make_id(sender)):
--> 172             response = receiver(signal=self, sender=sender, **named)
    173             responses.append((receiver, response))
    174         return responses

/usr/local/lib/python2.6/dist-packages/django_gstudio-0.3.dev-py2.6.egg/objectapp/signals.pyc in wrapper(*args, **kwargs)
     65             if inspect.getmodulename(fr[1]) == 'loaddata':
     66                 return
---> 67         signal_handler(*args, **kwargs)
     68 
     69     return wrapper

/usr/local/lib/python2.6/dist-packages/django_gstudio-0.3.dev-py2.6.egg/objectapp/signals.pyc in ping_external_urls_handler(sender, **kwargs)
     90         from objectapp.ping import ExternalUrlsPinger
     91 
---> 92         ExternalUrlsPinger(gbobject)
     93 
     94 

/usr/local/lib/python2.6/dist-packages/django_gstudio-0.3.dev-py2.6.egg/objectapp/ping.pyc in __init__(self, gbobject, timeout, start_now)
    153         threading.Thread.__init__(self)
    154         if start_now:
--> 155             self.start()
    156 
    157     def run(self):

/usr/lib/python2.6/threading.pyc in start(self)
    472         _active_limbo_lock.release()
    473         try:
--> 474             _start_new_thread(self.__bootstrap, ())
    475         except Exception:
    476             with _active_limbo_lock:

error: can't start new thread

Я не пишу код для обработки потоков.

Пожалуйста, опубликуйте полученные результаты. Bittrance
Это был полный след? Я скопировал его на ваш вопрос, но он кажется неполным? jdi
Пожалуйста, покажите нам, как вы запускаете темы. Эта часть о сохранении ваших данных БД не имеет значения. jdi
Исключение в потоке Thread-697: трассировка (последний вызов был последним): файл & quot; /usr/lib/python2.7/threading.py" ;, строка 552, в файле __bootstrap_inner self.run () & quot; / usr / local / lib / python2.7 / dist-packages / django_gstudio-0.3.dev-py2.7.egg / objectapp / ping.py & quot ;, строка 113, в файле run answer = self.ping_gbobject (gbobject) Файл & quot; / usr / local / lib / python2.7 / dist-packages / django_gstudio-0.3.dev-py2.7.egg / objectapp / ping.py & quot ;, строка 121, в файле ping_gbobject gbobject.get_absolute_url ()) & quot; / usr / local / lib / python2.7 / dist-packages / django / utils / functions.py & quot ;, строка 11, в _curried Rads

Ваш Ответ

2   ответа
0

роятно, одна из ваших библиотек порождает потоки и неправильно их исправляет. В качестве обходного пути попробуйте уменьшить размер стека потока по умолчанию сthreading.stack_size.

13

I don't have the rating to post in the comment section.

Одна вещь, которую нужно проверить - это общее количество потоков, которые вы используете. У меня есть некоторый код, который проверяет количество ядер (с помощью sys), а затем запускает потоки и проверяет загрузку ядра, чтобы проверить, как ОС обрабатывает распределение потоков, и я узнал, что Windows 7 (например), кажется, выдает ошибку за пределами 32 потоков на 8 (логическом) ядре процессора. [Это на Python 2.7, 32-битный в Win 7, 64-битный и т. Д., YMMMV]. На других машинах я могу пройти более 1000 потоков.

Итак, я думаю, короткая версия такова: сколько потоков у вас уже есть, когда вы получаете эту ошибку? Вы можете проверить с

threading.active_count()

Кроме того, вы не даете здесь поточную часть кода, так что я бы направил вас к этому превосходномуЦентральная страница Python.

Вы также можете извлечь выгоду из этого предыдущегоОбсуждение переполнения стека на большом потоке задача рассчитывает и как к ним подойти.

Again, my apologies that this is more of a direction to look than a solution, I think that more information is likely needed to help us understand what you're running into.

Я думаю, что это хороший ответ на неопределенный вопрос. Вы предполагаете, что OP запускает слишком много потоков, что является хорошим направлением.

Похожие вопросы