我正在运行一个脚本,它从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
我没有编写任何代码来处理线程。
答案 0 :(得分:13)
很抱歉在这里有一个不完整的解决方案,我没有在评论部分发布评分。
要检查的一件事是您运行的线程总数。我有一些代码检查核心数(使用sys),然后启动线程并检查核心加载以测试操作系统如何处理线程分配,并且我已经了解到Windows 7(例如)似乎抛出超过32个线程的错误在8(逻辑)核心CPU上。 [这是在Python 2.7,Win 7 64位等32位,YMMMV]。在其他机器上,我可以超过1,000个线程。
所以我想短版本是:当你收到错误时,你已经有多少线程?您可以查看
threading.active_count()
除此之外,你并没有真正给出代码中的线程部分,所以我会引导你进入这个优秀的Python Central page。
您可能还会受益于此前Stack overflow discussion大型线程任务计数以及如何处理它们。
再次,我很抱歉这不仅仅是一个解决问题的方向,我认为可能需要更多信息来帮助我们了解您遇到的问题。
答案 1 :(得分:0)
您正在使用32位系统并耗尽虚拟内存。您的某个库可能会生成线程而不能正确回收它们。作为解决方法,尝试使用threading.stack_size
减少默认线程堆栈大小。