RuneTimeError:无法启动新线程,线程库

时间:2018-02-15 21:59:37

标签: python multithreading

所以,在这段代码中,我正在测试一些多线程来加速我的代码。如果队列中有大量任务,则会出现RuneTimeError: Can't start new thread错误。例如,range(0,100)有效,但range(0,1000)无效。我正在使用threading.Semaphore(4),这是正常工作,一次只处理4个线程,测试这是有效的。我知道为什么我会收到此错误,因为即使我使用threading.Semaphore它仍然在技术上启动所有线程,但只是暂停它们直到线程转向运行并同时启动1000个线程对PC来说要处理的很多。反正有没有解决这个问题? (另外,是的,我知道GIL)

def thread_test():
    threads = []
    for t in self.tasks:
        t = threading.Thread(target=utils.compareV2.run_compare_temp, args=t)        
        t.start()
        threads.append(t)
    for t in threads:
        t.join()

for x in range(0,100):
    self.tasks.append(("arg1","arg2"))

thread_test()

1 个答案:

答案 0 :(得分:0)

不是启动1000个线程,而是让4个线程一次完成任何工作,而是启动4个线程并让它们全部工作。

购买你的额外996个主题是什么?

他们正在使用内存并对系统的调度程序施加压力。

你得到RuntimeError的原因可能是你为所有这些线程的调用堆栈耗尽了内存。默认限制因平台而异,但可能接近8MiB。其中有数千个,你只需8GiB左右...仅适用于堆栈空间。

您可以使用threading.stack_size(...)减少每个线程的调用堆栈的可用内存量。这样您就可以在系统上安装更多线程(但请确保不要将其设置为实际需要的堆栈空间量以下,否则会导致进程崩溃)。

最有可能的是,您真正想要的是一些进程接近主机上的物理核心数量或线程系统,它比threading模块更轻量级给你。