2012-05-14 26 views
3

我正在運行一個腳本,它從debian軟件包中提取信息並將其保存在數據庫中。「Python中無法啓動新的線程錯誤」

從大約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 

我不寫任何代碼來處理線程。

+5

請寄出你得到的追蹤。 – Bittrance

+1

異常螺紋加工-697: 回溯(最近通話最後一個): 文件 「/usr/lib/python2.7/threading.py」,線路552,在__bootstrap_inner self.run() 文件「/ USR /local/lib/python2.7/dist-packages/django_gstudio-0.3.dev-py2.7.egg/objectapp/ping.py「,行113,在運行 reply = self.ping_gbobject(gbobject) File」/ usr/local/lib/python2.7/dist-packages/django_gstudio-0.3.dev-py2.7.egg/objectapp/ping.py「,第121行,在ping_gbobject中 gbobject.get_absolute_url()) 文件」/ usr /local/lib/python2.7/dist-packages/django/utils/functional.py「,第11行,在_curried – Rads

+0

這是完整的追溯?我把它複製到你的問題,但它似乎不完整? – jdi

回答

13

對不起,在這裏有一個不完整的解決方案,我沒有評論張貼在評論部分。

要檢查的一件事是你正在運行的線程總數。我有一些代碼檢查內核的計數(與系統),然後啓動線程和檢查覈心加載,以測試操作系統如何處理線程分佈,我已經瞭解到,Windows 7(例如)似乎拋出超過32個線程的錯誤在一個8(邏輯)核心CPU上。 [這是Python 2.7,32位內Win 7 64位等,YMMMV]。在其他機器上,我可以通過1,000個線程。

所以我想短的版本是:當你得到這個錯誤時,你已經有多少個線程?你可以用

threading.active_count() 

除此之外檢查你真的不給代碼的螺紋部這裏,所以我會引導您到這個優秀的Python Central page

您可能還會從之前的Stack overflow discussion獲益於大型線程任務計數以及如何處理它們。

再一次,我很抱歉,這不僅僅是一個解決方案的方向,我認爲可能需要更多的信息來幫助我們理解您遇到的問題。

+2

我認爲這是一個很好的答案,以適應模糊的問題。你建議OP正在啓動太多的線程,這是很好的方向。 – jdi

0

您正在使用32位系統並且虛擬內存不足。你的一個庫可能會產生線程並且不能正確回收它們。作爲解決方法,請嘗試使用threading.stack_size減少默認線程堆棧大小。