2

我在 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 !

据我了解,它也与虚拟空间分配有关。任何可以帮助我增加线程数的机会/解决方案,因为有足够的内存可以使用?

预先感谢您的帮助!

4

1 回答 1

3

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

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

    threading.stack_size(64*1024)

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

于 2013-10-17T00:00:53.027 回答