我在 Windows 7 x64 上使用 Python 2.7 x86。我现在想坚持使用 Python 2.7 for x86,因为我编写的应用程序将在大多数 x86 机器上使用。
现在,我正在编写的脚本在大约 700 个线程上运行良好。我正在使用队列。出现了对更多线程的需求,所以很自然地,我只是增加了它们,但这并没有任何效果。脚本将因“无法启动新线程”异常而崩溃。
因此,在 stackoverflow 上进行了大量挖掘之后,我发现了使用 threading.stack_size() 的想法,我还阅读了有关 python 的文档。所以我继续这样做:
threading.stack_size(64*1024)
问题是,它没有效果。即使有足够的可用内存(接近 2.4GB),我仍然不能产生超过 700 个线程
这是适合的代码的一部分,以便更好地理解。
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 !
据我了解,它也与虚拟空间分配有关。任何可以帮助我增加线程数的机会/解决方案,因为有足够的内存可以使用?
预先感谢您的帮助!