python - 如何限制 Python 线程?

标签 python multithreading web2py

我有一个线程执行大量 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/

相关文章:

c - pthread_self() 返回的线程 ID 与调用 gettid(2) 返回的内核线程 ID 不同

python - 有些值在数组中被重新分配/更改,在 while 循环中,当它们不应该这样做时

python - 将串行链接的输入和输出转发到其他进程的标准输入和标准输出

python - 将行添加到 csv 文件而不创建中间副本

java - 了解 Java volatile 可见性

python - Python 中支持 GAE 的异步操作?

python - 夹层场注入(inject)

.net - 如何正确使用BeginRead的 'state'参数?

mysql - 如何将现有数据库导入到我的 db.py 模型中?

mysql - Web2py session 表不存在?