为什么threading.stack_size()不会产生想要的效果?

时间:2013-10-16 23:47:14

标签: c++ python multithreading networking

我在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可供使用?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

你真的不需要那么多线程。我知道你相信你这样做,但是 - 不,你没有; - )

那就是说,你打电话stack_size()的方式没有效果。在创建线程后,您无法更改堆栈大小,您必须在创建线程之前更改。所以移动这个:

    threading.stack_size(64*1024)

到模块级别,只执行一次,然后再创建任何线程。我不知道它是否会有所帮助,但这是正确的方法,你这样做是徒劳的。希望有所帮助!