2012-05-14 24 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减少默认线程堆栈大小。