回答
我刚刚结束了不久前潜入这个问题,你不能改变线程优先级,但有办法解决这个问题。
为了给你一点关于这个问题的背景知识,在cPython实现中,由于全局解释器锁或GIL被释放和获取的方式,CPU绑定线程可能导致其他线程挨饿。奇怪的是,这个问题在多核环境下变得更糟。关于这个问题的详细分析和介绍是由David Beazley完成的,你可以在http://www.dabeaz.com/python/GIL.pdf找到。他有几个更详细的博客文章。他们很长,但相当迷人。
简短版本是CPU绑定线程在其他线程被唤醒之前释放并重新获取GIL来获取它。 90%以上的时间导致CPU绑定线程持有GIL。
您可以使用一些模式来解决此问题。例如,您可以在完全不同的过程中运行您的CPU绑定任务。这将允许操作系统调度程序更好地管理资源共享,并允许您的web2py线程继续运行,因为操作系统实际上对IO绑定线程给予了优先处理。为这种情况提供了multiprocessing库。这将需要更多的代码才能使其工作,但这应该有所帮助。
多处理看起来像一个可能的选择,谢谢@ William-- – Chris 2012-03-05 17:57:25
您使用的是哪个版本的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调度程序完成它的工作。
- 1. 如何从boost线程调用Python?
- 2. Python线程调试
- 3. Python线程调度
- 4. 如何调节方法调用以允许线程完成
- 5. Python线程。我如何锁定线程?
- 6. 如何同步python线程?
- 7. 如何停止线程python
- 8. 如何运行一个线程在python外线程中调用的函数
- 9. 如何返回线程安全字节[]?
- 10. PYTHON:多处理怪癖(OR:如何协调这些线程?)
- 11. 在Python中,如何在线程回调中传递参数?
- 12. 如何为任务调度睡眠专用python线程?
- 13. 如何在Python中多次调用线程?
- 14. 多线程python脚本无声地死 - 如何调试
- 15. Python多线程:如何让守护进程线程运行
- 16. 的Python:从主线程或调用线程
- 17. Python的调用pipe.communicate()在一个线程
- 18. 从Python线程中调用的ActiveX DLL
- 19. 从C API多线程调用python
- 20. 在线程中调用dbus-python
- 21. 线程不会调用函数(Python)
- 22. 在Python线程中调用TBB'parallel_for'
- 23. Python单线程调用函数列表
- 24. 从C线程调用Python代码
- 25. 从C++线程调用python脚本,GIL
- 26. Python线程/线程实现
- 27. Python线程不是线程
- 28. 节流C++线程
- 29. Laravel 4路线调节
- 30. 如何从python中的线程池中唤醒线程?
线程的密集程度不太可能导致它被阻塞。更有可能的是,您遇到了Global Interpreter Lock(http://wiki.python.org/moin/GlobalInterpreterLock)的问题。您需要为我们提供更多信息来评估情况。你的线程究竟在干什么? – Wilduck 2012-03-03 00:16:11
@Wilduck CPU密集型线程可能会增加IO延迟(尽管在最近的Python中没有这么做),请参阅以下内容:http://dabeaz.blogspot.com/2010/01/python-gil-visualized.html – Tobu 2012-03-03 11:18:12
@Wilduck该线程实际上在JS中调用代码。我很想尝试释放GIL(如果它还没有的话),但这会迫使我确保JS在任何时候都不需要GIL ......我可能会暂时放弃它并找到解决方法。 – Chris 2012-03-05 18:00:52