Chr*_*ris 6 python multithreading web2py
我有一个线程做了很多CPU密集型处理,这似乎阻止了其他线程.我该如何限制它?
这是针对web2py的,但一般解决方案没问题.
事实上,我不久前刚刚开始研究这个问题,你将无法更改线程优先级,但有一些方法可以解决这个问题。
为了给您一些有关该问题的背景知识,在 cPython 实现中,CPU 绑定线程可能会由于全局解释器锁或 GIL 的释放和获取方式而导致其他线程饥饿。奇怪的是,这个问题在多核环境中变得更糟。David Beazley对这个问题进行了非常详细的分析和演示,您可以在http://www.dabeaz.com/python/GIL.pdf上找到它。他有几篇博客文章更详细地介绍了这些内容。它们很长,但相当迷人。
简而言之,CPU 绑定线程会释放并重新获取 GIL,然后才能唤醒其他线程来获取 GIL。导致 CPU 密集型线程在超过 90% 的时间里持有 GIL。
您可以使用一些模式来解决此问题。例如,您可以在完全不同的进程中运行 CPU 密集型任务。这将使操作系统调度程序能够更好地管理资源共享,并且应该允许您的 web2py 线程继续运行,因为操作系统实际上会优先对待 IO 绑定线程。多处理库就是为此类情况提供的。它将需要更多代码才能使其正常工作,但这应该会有所帮助。