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

C++ 为什么threading.stack_size()不能产生想要的效果?,c++,python,multithreading,networking,C++,Python,Multithreading,Networking,我在Windows7x64上使用Python2.7x86。我现在想继续使用Python2.7 for x86,因为我编写的应用程序将在大多数x86机器上使用 现在,我正在编写的脚本可以在700个线程左右正常工作。我在排队。 需要更多的线程出现了,所以很自然,我只是增加了线程,但没有任何效果。脚本将崩溃,出现“无法启动新线程”异常 因此,在这里对stackoverflow进行了大量挖掘之后,我发现了使用threading.stack_size()的想法,我还阅读了python上关于这一点的文档。

我在Windows7x64上使用Python2.7x86。我现在想继续使用Python2.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监视器,有大量备用内存可用,还有空闲内存。 它只是拒绝通过700标记。 我是否使用了堆栈大小()错误? 请不要建议我使用Twisted/asyncore

据我所知,这也与虚拟空间分配有关。考虑到内存充足,有没有任何机会/解决方案可以帮助我增加线程数


提前感谢您的帮助

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

也就是说,您调用
stack\u size()
的方式没有效果。创建线程后不能更改堆栈大小,必须在创建线程之前更改堆栈大小。因此,请提出以下建议:

    threading.stack_size(64*1024)

到模块级,仅在创建任何线程之前执行一次。我不知道这是否会有帮助,但这是正确的方法,你这样做是徒劳的。希望有帮助

这里的问题不是一个将你的线程数限制在700个以内的设计,而是认为能够创建更多的线程(甚至差不多那么多)会很有用。这对我的问题没有帮助,而且有点过头了。如果我不需要那么多,我就不会在这个问题上花费数小时和数天,是吗?我不是故意不尊重你,但我来这里是为了帮助你,不是为了重新设计代码。不过,我很感谢你的提醒。我写这篇文章是作为评论,而不是回答,原因很简单,那是评论,不是对你所问问题的回答。我真诚地希望有人能对你的问题给出一个直接的答案——但如果他们这样做了,我怀疑这是否真的有帮助。@IchabodCrane:因为我真的怀疑你是否有一台运行Python的700核机器,你的大多数线程都将按顺序执行,随着持续上下文更改和GIL lock/unlock/wait(顺便说一句,除非您的代码是IO绑定的,否则它会自行杀死并行性)的额外开销的增加,Jerry Coffin的观察非常准确。你很可能在一个失败的事业上浪费时间。这闻起来很像一个XY问题,你应该解释你试图解决的实际问题是什么,肯定有更好的方法来解决它,而不是使用700个线程。实际上这正是我所需要的。我做了修改,效果很好。非常感谢你的帮助!不客气!现在,您应该解释真正的问题,这样我们就可以帮助您摆脱大约690个线程;-)客户端只需要在脚本运行时关闭更多电源。这是唯一的问题,速度。我不知道如何比使用线程做得更好。我读过关于asyncore/twisted的文章,但是我从来没有找到任何关于如何将它与一个接受argv的函数一起使用的例子,该函数连接到大量套接字。