我在Windows 7 x64上使用Python 2.7 x86。我现在想坚持使用Python 2.7 for x86,因为我代码的应用程序无论如何都将在x86机器上使用。
现在,我正在处理的脚本在大约700个线程上工作正常。我正在使用队列。 出现了对更多线程的需求,当然,我只是增加了它们,但这没有任何影响。脚本将因“无法启动新线程”异常而崩溃。
所以在很多关于stackoverflow的挖掘之后,我发现了使用threading.stack_size()的想法,我也阅读了关于它的python文档。 所以我继续这样做了:
threading.stack_size(64*1024)
问题是,它没有效果。我仍然无法生产超过700个线程,即使有足够的ram是免费的(接近2.4GB)
以下是适合的代码的一部分,以便更好地理解。
class Downloader(threading.Thread):
#----------------------------------------------------------------------
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
#----------------------------------------------------------------------
def run(self):
while True:
host,user,page= self.queue.get()
self.checker(host,user,page)
self.queue.task_done()
threading.stack_size(64*1024)
经过数小时和数小时搜索问题后,我遇到的单个解决方案是一起重新编译python并编辑有关堆栈大小的部分。这个选项在我之上,我很确定我的问题还有另一个优雅的解决方案。
我已经检查了Res Monitor,并且有足够的备用内存可供使用,空闲内存也是如此。 它只是拒绝通过700标记。 我使用stack_size()错了吗? 请不要建议我使用Twisted / asyncore!
据我所知,它也与虚拟空间分配有关。任何可以帮助我增加线程数的机会/解决方案,因为有足够的RAM可供使用?
提前感谢您的帮助!
答案 0 :(得分:2)
你真的不需要那么多线程。我知道你相信你这样做,但是 - 不,你没有; - )
那就是说,你打电话stack_size()
的方式没有效果。在创建线程后,您无法更改堆栈大小,您必须在创建线程之前更改。所以移动这个:
threading.stack_size(64*1024)
到模块级别,只执行一次,然后再创建任何线程。我不知道它是否会有所帮助,但这是正确的方法,你这样做是徒劳的。希望有所帮助!