所以,在这段代码中,我正在测试一些多线程来加速我的代码。如果队列中有大量任务,则会出现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()
答案 0 :(得分:0)
不是启动1000个线程,而是让4个线程一次完成任何工作,而是启动4个线程并让它们全部工作。
购买你的额外996个主题是什么?
他们正在使用内存并对系统的调度程序施加压力。
你得到RuntimeError
的原因可能是你为所有这些线程的调用堆栈耗尽了内存。默认限制因平台而异,但可能接近8MiB。其中有数千个,你只需8GiB左右...仅适用于堆栈空间。
您可以使用threading.stack_size(...)
减少每个线程的调用堆栈的可用内存量。这样您就可以在系统上安装更多线程(但请确保不要将其设置为实际需要的堆栈空间量以下,否则会导致进程崩溃)。
最有可能的是,您真正想要的是一些进程接近主机上的物理核心数量或线程系统,它比threading
模块更轻量级给你。