我有一个线程执行大量 CPU 密集型处理,这似乎阻塞了其他线程。我如何限制它?
这是专门针对 web2py 的,但通用的解决方案就可以了。
最佳答案
实际上我不久前才开始深入研究这个问题,你无法更改线程优先级,但有办法解决这个问题。
为了让您了解一下这个问题的背景知识,在 cPython 实现中,由于释放和获取全局解释器锁或 GIL 的方式,CPU 绑定(bind)线程可能会导致其他线程饿死。奇怪的是,这个问题在多核环境中变得更糟。 David Beazley 对此问题进行了非常详细的分析和介绍。您可以在 http://www.dabeaz.com/python/GIL.pdf 找到.他有几篇更详细的博客文章。它们很长,但非常迷人。
简短的版本是 CPU 绑定(bind)线程在其他线程被唤醒以获取它之前释放并重新获取 GIL。导致 CPU 绑定(bind)线程在超过 90% 的时间内占用 GIL。
您可以使用一些模式来解决此问题。例如,您可以在完全不同的进程中运行 CPU 密集型任务。这将允许操作系统调度程序更好地管理资源共享,并且应该允许您的 web2py 线程继续运行,因为操作系统实际上优先处理 IO 绑定(bind)线程。 multiprocessing为此类情况提供了库。它需要更多代码才能使其正常工作,但这应该会有所帮助。
关于python - 如何限制 Python 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9542091/