我有一个线程正在进行大量的CPU密集型处理,这似乎阻止了其他线程。我如何限制它?
这是针对web2py的,但一般解决方案没问题。
答案 0 :(得分:4)
我实际上刚刚结束了这个问题不久前,你将无法改变线程的优先级,但有办法解决这个问题。
为了给你一些关于这个问题的背景知识,在cPython实现中,由于Global Interpreter Lock或GIL的发布和获取方式,CPU绑定线程会导致其他线程饿死。奇怪的是,这个问题在多核环境中变得更糟。有关此问题的详细分析和演示由David Beazley完成,您可以在http://www.dabeaz.com/python/GIL.pdf找到。他有几篇博文,详细介绍。它们很长但很吸引人。
简短版本是CPU绑定线程释放并重新获取GIL,然后才能唤醒其他线程以获取它。导致持有GIL的CPU绑定线程超过90%的时间。
您可以使用一些模式来解决此问题。例如,您可以在完全不同的过程中运行CPU绑定任务。这将允许操作系统调度程序更好地管理资源共享,并且应该允许您的web2py线程继续运行,因为操作系统实际上对IO绑定线程给予优先处理。 multiprocessing库是为此类案例提供的。它需要更多代码才能使其正常工作,但这应该会有所帮助。
答案 1 :(得分:1)
您使用的是哪个版本的Python?在3.2中,the GIL was changed to yield after fixed timeslices rather than after a certain number of high-level opcodes。
即使进行了这种更改,运行CPU密集型代码也会影响Web应用程序的延迟(相反,IO敏感部分会阻止CPU密集型部分占用整个内核)。您应该使用像beanstalkd这样的队列将任务分离到工作进程,并让OS调度程序自行完成。