我有一个线程在进行大量的CPU密集型处理,似乎阻塞了其他线程。我该如何限制它?
这是针对web2py的特定情况,但通用的解决方案也可以。
这是针对web2py的特定情况,但通用的解决方案也可以。
我不久前刚刚深入研究了这个问题,你无法改变线程的优先级,但有些方法可以解决这个问题。
为了让你更好地理解问题的背景,cPython实现中的CPU绑定线程会因全局解释器锁(GIL)的释放和获取方式而导致其他线程饿死。奇怪的是,在多核环境下,这个问题会更加严重。 David Beazley 对这个问题进行了详细的分析和演示,你可以在 http://www.dabeaz.com/python/GIL.pdf 上找到他的文章。他还有一些更详细的博客文章,虽然很长,但非常有趣。
简单来说,CPU绑定线程在其他线程被唤醒之前释放并重新获取GIL,导致CPU绑定线程持有GIL超过90%的时间。
有一些模式可以用来解决这个问题。例如,你可以在完全不同的进程中运行CPU绑定任务。这将允许操作系统调度程序更好地管理资源共享,并应该允许您的web2py线程继续运行,因为操作系统实际上会给予IO绑定线程优先处理。为此,提供了multiprocessing库。它需要一些额外的代码才能工作,但应该有所帮助。